拥有以下模型
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
如何执行单个查询而不是每个版本一个?
答案 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