我有两个关系模型:
Company has_many :quotes
我想删除反模式逻辑并将其放在控制器中:
<%= Quote.where(company_id: c.id).where(paid: true).count %>
设置:
控制器:
@companies = Company.all
查看:
<% @companies.each do |c| %>
<%= Quote.where(company_id: c.id).where(paid: true).count %>
<% end %>
我想显示每家公司的总报价。虽然上面的工作,我不希望在视图中的逻辑。如何把它放在控制器中?
我在控制器中有这个:
...
@jobs_count = @companies.map do |c| Quote.where(company_id: c.id).where(paid:true) end
...
这不起作用。视图页面不使用参数。
答案 0 :(得分:3)
Company.has_many :quotes
已允许您使用company.quotes
而不是Quote.where(company_id: company.id)
。
现在,在Quote
模型上定义此范围:
class Quote
scope :paid, -> { where paid: true }
# ...
end
现在您的观点可以说
<% @companies.each do |c| %>
<%= c.quotes.paid.count %>
<% end %>
......无需对控制器进行任何更改。
这看起来更好吗?
答案 1 :(得分:1)
PJSCopeland通过使用命名范围提出了一个很好的建议:
class Quote
scope :paid, -> { where paid: true }
end
但我建议将“引用支付数量”作为您Company
模型的关注点继续前进:
class Company
def quote_count
quotes.paid.count
end
end
然后在你看来:
<% @companies.each do |c| %>
<%= c.quote_count %>
<% end %>
这也可以让您更轻松地对Quote
和Company
模型进行单元测试。