Есть ли лучший способ рассчитывать на три уровня вложенных форм - PullRequest
0 голосов
/ 11 января 2010

У меня есть вложенные формы, такие как:

class House < ActiveRecord::Base
  has_many :rooms
  accepts_nested_attributes_for :rooms
  attr_accessible :rooms_attributes
end

class Room < ActiveRecord::Base 
  has_one :tv
  accepts_nested_attributes_for :tv
  attr_accessible :tv_attributes
end

class Tv 
  belongs_to :user
  attr_accessible :manufacturer
  validates_presence_of :user
end

Теперь я хочу узнать для house.id = 1, сколько всего комнат и телевизоров.

В контроллере Houses я отдал

@houses = House.all

И довольно просто подсчитать количество комнат для каждого дома, как

<% for house in @houses %>
<%= house.rooms.count %>
<% end -%>

У меня вопрос, как узнать количество телевизоров? Я использую это сейчас

<%= house.rooms.map {|room| room.tvs.count}.sum %>

Это работает, но я не уверен, хорошо это или нет. Есть ли лучший способ получить его?

1 Ответ

0 голосов
/ 11 января 2010

Я бы поместил метод в модель, пытаясь избежать кода в представлениях.

class House
  ...
  def tvs
    rooms.inject(0) {|r, t| t + r.tvs }
  end
end

class Room
  ...
  def tvs
    tv ? 1 : 0 # it's has_one association right now
  end
end

Также, если в вашем контроллере вы загружаете все объекты Дома, и после этого вам понадобятся объекты Rooms, вы должны загрузить дома как:

House.find :all, :include => { :rooms => :tv }

Таким образом, вы собираетесь выполнить 1 запрос, при вашем подходе будет 1 + N_rooms + N_tvs запросов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...