我正在尝试过滤待办事项列表的索引页,t.datetime "completed_at"
我的任务表中有列。
目前,我的表单是这样的,
<%= form_with model: @task, method: :GET do |f| %>
<%= f.label "Complete" %>
<%= f.radio_button :completed, "complete" %>
<%= f.label "Incompleted" %>
<%= f.radio_button :completed, "incomplete" %>
<%= f.label "All tasks" %>
<%= f.radio_button :completed, "all_tasks" %>
<%= f.submit "Filter" %>
<% end %>
和我的控制器
def index
if params[:completed] == "complete"
@tasks = Task.where(completed_at: !nil)
elsif params[:completed] == "incomplete"
@tasks = Task.where(completed_at: nil)
else
@tasks = Task.all
end
end
我正在尝试使用completed_at
等于nil来完成任务,完成任务将!nil
作为日期时间,当检查完成时将被存储。如果有人能指出正确的方向或举一个如何使它正常工作的例子,我将不胜感激。谢谢。
导轨-6红宝石-2.7
通过否定,nil
您将获得true
,这样就不会过滤没有nil
completed_at
行的任务,而不会过滤具有completed_at
true的任务。
您可以分配@tasks
给Task.all
,然后根据对其进行params[:completed]
修改的值:
def index
completed = params[:completed]
@tasks = Task.all
@tasks = Task.where.not(completed_at: nil) if completed == 'complete'
@tasks = Task.where(completed_at: nil) if completed == 'incomplete'
end
where.not
执行技巧来执行IS NOT NULL
查询。
或者,如果您想更加面向对象;
class Tasks
def initialize(completed)
@completed = completed
end
def complete_filter
return Task.where.not(completed_at: nil) if complete?
return Task.where(completed_at: nil) incomplete?
Task.all
end
private
attr_reader :completed
def complete?
completed == 'complete'
end
def incomplete?
completed == 'incomplete'
end
end
def index
@tasks = Tasks.new(params[:completed]).complete_filter
end
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句