小编Der*_*ior的帖子

在 Rspec 中测试物化视图

使用Scenic gem,我构建了一个由物化视图支持的 ActiveRecord 模型

class MatviewSales < ActiveRecord::Base
  self.table_name = 'matview_sales'
  self.primary_key = :id

  belongs_to :user
  belongs_to :account
  belongs_to :account_manager, class_name: User, foreign_key: 'manager_id'

  def self.refresh
    Scenic.database.refresh_materialized_view(table_name, concurrently: true)
  end
end
Run Code Online (Sandbox Code Playgroud)

我现在尝试在 RSpec 中测试这个模型,但无论我做什么,我都无法让 Postgres 用记录填充视图:

> FactoryGirl.create(:sale_item)
> MatviewSales.refresh
> MatviewSales.all
=> #<ActiveRecord::Relation []> 
Run Code Online (Sandbox Code Playgroud)

如何使用测试记录填充物化视图?

postgresql rspec ruby-on-rails materialized-views scenic

6
推荐指数
1
解决办法
3136
查看次数

使用group_by和fields_for以及accepts_nested_attributes_for

我有以下导轨型号:

class Release < ActiveRecord::Base
    has_many :release_questionnaires, :dependent => :destroy
    accepts_nested_attributes_for :release_questionnaires
    ...
end class

class ReleaseQuestionnaire < ActiveRecord::Base
    belongs_to :release
    belongs_to :milestone
    ...
end class
Run Code Online (Sandbox Code Playgroud)

在我的视图代码中,我有以下形式.

<% form_for @release, ... do |f| %>
  ...
  <table class="questionnaires">
    <% f.fields_for :release_questionnaires, @release.release_questionnaires.sort_by{|ra| ra.questionnaire.name} do |builder| %>
      ...
    <% end %>
  </table>
<% end %>
Run Code Online (Sandbox Code Playgroud)

这有效,并允许我根据需要查看和编辑问卷.但是,我还有一个额外的要求是将调查问卷分解到他们自己的表中,这些表按照与之关联的里程碑分组,而不是在单个表中.看起来好像group_by方法是为了实现这一点而设计的,但我无法让它在标签内按需工作.

可能是因为我是初学者,我遗漏了一些明显的东西......任何帮助都会受到赞赏.

ruby-on-rails

5
推荐指数
1
解决办法
1254
查看次数

获取没有标签标签包装的国际化标签文本

FormBuilder#label方法(请参阅docs)返回<label>给定属性的标记.如果用户没有为标签提供文本,则使用i18n库进行查找.支票的顺序是:

  1. helpers.label.object.method
  2. object.class.human_attribute_name(method_name)
  3. method_name.humanize

是否有任何API方法执行类似的查找,但不将输出包装在<label>标记中?如果没有,那么<label>FormBuilder#label没有剥离国际化字符串可能包含的任何其他HTML标记的情况下,从返回的标记中剥离标记的最佳方法是什么.

ruby-on-rails internationalization ruby-on-rails-3.1

5
推荐指数
1
解决办法
625
查看次数

ARel:为外连接添加其他条件

我的Rails应用程序中有以下模型:

class Shift < ActiveRecord::Base
  has_many :schedules
  scope :active, where(:active => true)
end

class Schedule < ActiveRecord::Base
  belongs_to :shift
end
Run Code Online (Sandbox Code Playgroud)

我希望生成所有活动班次的集合,并急切加载occurs_on两个给定日期之间的任何相关计划.如果班次在这些日期之间没有时间表,则仍应在结果中返回.

本质上,我想生成相当于的SQL:

SELECT shifts.*, schedules.*
FROM shifts
  LEFT JOIN schedules ON schedules.shift_id = shifts.id
    AND schedules.occurs_on BETWEEN '01/01/2012' AND '01/31/2012'
WHERE shifts.active = 't';
Run Code Online (Sandbox Code Playgroud)

我的第一次尝试是:

Shift.active.includes(:schedules).where("schedules.occurs_on BETWEEN '01/01/2012' AND '01/31/2012')
Run Code Online (Sandbox Code Playgroud)

问题是happen_on过滤是在where子句中完成的,而不是在join中完成的.如果班次在该期间没有时间表,则根本不返回.

我的第二次尝试是使用该joins方法,但这是一个内连接.同样,这将丢弃那段没有时间表的所有班次.

我很沮丧,因为我知道我希望AREL生成的SQL,但我无法弄清楚如何使用API​​来表达它.任何人?

activerecord ruby-on-rails arel ruby-on-rails-3.1

1
推荐指数
1
解决办法
2066
查看次数