如何计算has_many关联的所有子记录?

时间:2016-10-17 16:10:58

标签: ruby-on-rails postgresql activerecord

拥有以下模型

class Release
  has_many :sprints
end

class Sprint
  has_many :tasks
  belongs_to :release
end

class Task
  belongs_to :sprint
end

如何计算特定tasks的所有release

我尝试了这个,但它执行了两个查询,看起来效率不高:

def total_task_count
  release = Release.find(1)
  Task.where(sprint_id: release.sprints.pluck(:id)).count
end

计算儿童协会中所有儿童协会的更好方法是什么?

另外,如果我想在列表视图中执行此操作:

@releases.each do |release|
  <%= release.total_tasks_count %>
end

如何执行单个查询而不是每个版本一个?

3 个答案:

答案 0 :(得分:4)

添加has_many through关系。请参阅Rails guide

release模型中,添加:

has_many :tasks, through: :sprints

然后你可以做

@releases.each do |release|
  <%= release.tasks.count %>
end

答案 1 :(得分:2)

正如John Feltz所说,你可以在has_many through模型上使用Release

要一次运行所有查询,您还可以使用.includes

Release.includes(:task).find(#{id_here})

当您致电release.tasks.count时,它已经拥有了数据,因此它不会运行其他查询。详情了解API Docs中的includes

答案 2 :(得分:1)

你可以这样做:

def total_task_count
  Task.joins(:sprints).merge(Sprint.where(release_id: 1)).count
end