如何在相关记录上加条件?

时间:2014-04-24 10:03:03

标签: ruby-on-rails activerecord ruby-on-rails-4 rails-activerecord

以下是我的模特:

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应该使用上面的视图并输出相同的部分,但这些部分中的任务可能不同。

2 个答案:

答案 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编辑为更聪明的方式来实现。