从视图中删除反模式到控制器

时间:2016-02-29 22:03:46

标签: ruby-on-rails ruby ruby-on-rails-4

我有两个关系模型:

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

...

这不起作用。视图页面不使用参数。

2 个答案:

答案 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 %>

这也可以让您更轻松地对QuoteCompany模型进行单元测试。