Ruby on Rails — Рефакторинг запросов ActiveRecord из представления в модель

Я знаю о совете «толстые модели / тощие контроллеры» и «никогда не помещайте логику в представление»; тем не менее, это помогло бы мне учиться на примере. Далее, как лучше всего переписать код, чтобы запрос не отображался в представлении?

Модель

 class Product < ActiveRecord::Base
   belongs_to :order
 end

 class Order < ActiveRecord::Base
   has_many :products
 end

Контроллер

 @orders = Order.all

Просмотреть

 <% @orders.each do |o| %>
 <%= Product.where("order_id = ?", o.id).count %>
 <% end %>

person diasks2    schedule 29.06.2012    source источник
comment
Там нет необходимости для фрагмента, который вы показываете.   -  person Dave Newton    schedule 29.06.2012


Ответы (1)


Это зависит от того, что именно вы хотите отобразить, но самый простой вариант — воспользоваться указанными вами ассоциациями:

<% @orders.each do |o| %>
  <%= o.products.count %>
<% end %>

Затем в контроллере вы можете использовать нетерпеливую загрузку, чтобы оптимизировать вызовы SQL. .

@orders = Order.all(:include => :products)
person muffinista    schedule 29.06.2012
comment
Спорный вопрос, относится ли это к контроллеру, хотя - ИМО, это зависит от нескольких факторов. Он может принадлежать самому отображению, он может принадлежать методу класса модели и т. д. - person Dave Newton; 29.06.2012
comment
Это определенно зависит, согласен. - person muffinista; 29.06.2012
comment
Интересно, спасибо за оба ответа. У меня сложилось впечатление, что это будет более резко и сухо. Спасибо за вашу помощь! - person diasks2; 29.06.2012