Страница индекса запроса для фильтрации результатов, показанных в таблице - RoR - PullRequest
1 голос
/ 09 июля 2020

Я пытаюсь отфильтровать страницу индекса списка задач, у меня есть столбец 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 ruby - 2,7

1 Ответ

2 голосов
/ 09 июля 2020

Отрицая nil, вы получите true, чтобы не фильтровать задачи не с nil completed_at строками, а с completed_at как истинными.

Вы могли бы назначьте @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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...