Rails - 仅在满足特定条件时显示循环

时间:2012-12-05 17:40:14

标签: ruby-on-rails loops

我有一个带有布尔属性'status'的project_todo模型。如何在索引页面上显示仅列出状态为false的项目待办事项的循环?

列出所有项目待办事项的常规循环如下所示:

<% @project.project_todos.each do |todo|%>
    <li data-id="<%= todo.id %>">
        <%= todo.title %>
    </li>
<% end %>

我正在玩一个循环,如果状态为假,只显示待办事项:

<% @project.project_todos {status = "f"}.each do |todo|%>
    <li data-id="<%= todo.id %>">
        <%= todo.title %>
    </li>
<% end %>

我在附近吗?

2 个答案:

答案 0 :(得分:1)

如果您可以提供帮助,请不要在视图中添加太多逻辑。在这种情况下,您可以在ProjectTodo上创建范围,以根据status字段进行过滤。

class ProjectTodo < ActiveRecord::Base
  scope :inactive, where(status: false)
  #...
end

然后在你看来,你可以做到

<% @project.project_todos.inactive.each do |todo|%>
    <li data-id="<%= todo.id %>">
        <%= todo.title %>
    </li>
<% end %>

答案 1 :(得分:0)

这将仅在具有status == false

的project_todos上循环
<% @project.project_todos.select{|project_todos| project_todos.status == false}.each do |todo|%>
    <li data-id="<%= todo.id %>">
        <%= todo.title %>
    </li>
<% end %>

或,更好的解决方案:您可以执行以下操作,并让ActiveRecord过滤project_todos本身:

<% @project.project_todos.where(status: false).each do |todo|%>
    <li data-id="<%= todo.id %>">
        <%= todo.title %>
    </li>
<% end %>

在扩展中

您可以创建如下的范围:

class ProjectTodo < ActiveRecord::Base
  #...
  scope :with_status, lambda{ |status| where(status: status) }
  #...
end

并像这样使用它:

@project.project_todos.with_status(status: false) # Returns the project_todos with a status == false and belonging to the @project