Ruby on rails 用于筛选表-RoR中显示的结果的查询索引页

Ruby on rails 用于筛选表-RoR中显示的结果的查询索引页,ruby-on-rails,ruby,forms,parameters,Ruby On Rails,Ruby,Forms,Parameters,我正在尝试筛选待办事项列表的索引页,我的任务表中有列t.datetime“completed\u at” 目前我的表格是这样的 <%= form_with model: @task, method: :GET do |f| %> <%= f.label "Complete" %> <%= f.radio_button :completed, "complete" %> <%= f.label &quo

我正在尝试筛选待办事项列表的索引页,我的任务表中有列
t.datetime“completed\u 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 %>
我试图使用
completed\u at
等于nil是一个不完整的任务,而complete任务将是
!当检查为完成时,将存储nil
作为日期时间。如果有人能给我指出正确的方向,或者给我举个例子说明如何使这项工作顺利进行,我将不胜感激。谢谢

轨道-6
ruby-2.7

通过对
nil
求反,您将得到
true
,这样就不会过滤行中未
nil
已完成的任务,而是将行中
已完成的任务作为true进行过滤

您可以将
@tasks
分配给
Task.all
,然后根据
参数[: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

第一个例子是正确的,对我有帮助,当我有更多的时间时,我也可以尝试你的第二个建议。谢谢
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