使用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)
如何使用测试记录填充物化视图?
我有以下导轨型号:
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方法是为了实现这一点而设计的,但我无法让它在标签内按需工作.
可能是因为我是初学者,我遗漏了一些明显的东西......任何帮助都会受到赞赏.
该FormBuilder#label方法(请参阅docs)返回<label>给定属性的标记.如果用户没有为标签提供文本,则使用i18n库进行查找.支票的顺序是:
helpers.label.object.methodobject.class.human_attribute_name(method_name)method_name.humanize是否有任何API方法执行类似的查找,但不将输出包装在<label>标记中?如果没有,那么<label>从FormBuilder#label没有剥离国际化字符串可能包含的任何其他HTML标记的情况下,从返回的标记中剥离标记的最佳方法是什么.
我的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来表达它.任何人?