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をロードする必要があります

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

このように、1つのクエリを実行します。アプローチでは、1 + N_rooms+N_tvsクエリがあります。

于 2010-01-11T13:45:57.497 に答える