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

因此,project.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 回答
0

我不确定在发布此问题时是否可行,但现在has_many :through似乎是此任务的明显且语义选择:

# Group
has_many :time_entries, through: projects

然后你可以这样做:

@group.time_entries
于 2015-10-09T13:10:31.577 回答