以下是我的模特:
class Checklist < ActiveRecord::Base
has_many :checklists_tasks
has_many :tasks, through: :checklists_tasks
end
class ChecklistsTask < ActiveRecord::Base
belongs_to :checklist
belongs_to :task
end
class Section < ActiveRecord::Base
has_many :tasks
end
class Task < ActiveRecord::Base
belongs_to :section
has_many :checklists_tasks
has_many :checklists, through: :checklists_tasks
end
然后我有这样的观点:
<% @sections.each do |section| %>
<h2><%= section.name %></h2>
<ul>
<% section.tasks.each.do |task| %>
<li><%= task.name %></li>
<% end %>
</ul>
<% end %>
如何查询Section并确保与每个Section相关的任务都与某个Checklist相关联?
为了澄清,/ checklists / 1 / show和/ checklists / 2 / show应该使用上面的视图并输出相同的部分,但这些部分中的任务可能不同。
答案 0 :(得分:1)
如果您要显示属于当前核对清单的部分任务,请尝试以下操作:
<% @sections.each do |section| %>
<h2><%= section.name %></h2>
<ul>
<% # get the checklist's id in url => /checklists/:id %>
<% check_list_id = params[:id] %>
<% # query tasks using section_id and check_list_id %>
<% tasks = Task.find_by(section_id: section.id, check_list_id: check_list_id) %>
<% tasks.each.do |task| %>
<li><%= task.name %></li>
<% end %>
<% end %>
答案 1 :(得分:0)
通过向Section添加方法结束解决此问题。
class Section < ActiveRecord::Base
has_many :tasks
def tasks_by_checklist(checklist)
if checklist != nil
Task.where(section_id: self.id, checklists_tasks: { checklist_id: checklist.id}).includes(:checklists_tasks)
else
self.tasks
end
end
end
然后更新视图以使用此新方法:
...
<% section.tasks_by_checklist(@checklist).each.do |task| %>
...
由于@checklist在/ tasks(索引)中为nil,但在/ checklist /:id / show中设置,因此同一视图对两个控制器操作都有效。
我仍然很好奇是否有办法通过将控制器中的@sections = Section.all
编辑为更聪明的方式来实现。