0

我有一个嵌套形式,如:

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_controller中

@houses = House.all

获取每栋房屋的房间数量非常简单,例如

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

我的问题是如何获得电视计数?我现在正在使用这个

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

它有效,但我不确定这是否好。有没有更好的获取方式?

4

1 回答 1

0

我会在模型中放置一个方法,试图避免视图中的代码。

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

此外,如果在您的控制器中您正在加载所有 House 的对象,并且之后您将需要 Rooms 对象,您应该像这样加载房屋:

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

这样,您将进行 1 个查询,您的方法将有 1 + N_rooms + N_tvs 查询

于 2010-01-11T13:45:57.497 回答