4

私は次のようなものを持っています:

class Group < ActiveRecord::Base
  has_many :group_projects, dependent: :destroy
  has_many :projects, through: :group_projects
end

class Projects < ActiveRecord::Base
  has_many :group_projects, dependent: :destroy
  has_many :groups, through: :group_projects

  has_many :time_entries
end

class TimeEntry < ActiveRecord::Base
  belongs_to :project
end

したがって、そのプロジェクトに属する time_entriesproject.time_entriesの を返します。ActiveRecord::Associations::CollectionProxy

私が欲しいのは、次のようなことをしなくても、特定のグループに関連付けられたすべてのプロジェクトに関連付けられたすべての time_entries のリストを単一のコレクションとして作成することです。

TimeEntry.where(["project_id IN (?)", @group.projects.map{|p| p.id } ])

PS: Rails 4.0.0 を使用する | ルビー 2.0.0

4

3 に答える 3

3

サブセット条件に関するエッジ ドキュメントに従って、where()クエリの条件ハッシュに配列を渡すことができます。ActiveRecord::Relationこれは、オブジェクトの配列ではなくを返します。

TimeEntry.where(project_id: @group.projects(&:id))

マッピングの短縮形 (アンパサンドのある部分) の使用に注意してください。これは、複数のオブジェクトで単一の属性の配列を返すための代替の (おそらく) より読みやすい方法です。

@group.projects.map{|p| p.id} == @group.projects(&:id)
于 2013-09-25T15:58:43.003 に答える
3

zeantsoi の回答に加えて、次のものも使用できます。

TimeEntry.where(project_id: @group.project_ids)

@group.project_idsそのグループのすべての ID の配列を返します。

お役に立てば幸いです。

于 2013-09-26T11:02:41.890 に答える