Область применения с двумя параметрами рельсов - PullRequest
0 голосов
/ 24 января 2020

Я следую этому руководству , чтобы реализовать функцию фильтрации в моем приложении Rails. Я хочу, чтобы администраторы могли фильтровать по возрасту, идентификатору и интервалу дат, которые были созданы пользователями. Это последнее, что вызывает у меня головную боль.

В моей модели user.rb я определил следующие области действия:

scope :created_between, -> (startdate, enddate) {where(created_at: startdate..enddate)}
scope :identified, -> { where.not(identifier: [nil, '']) }
scope :age, -> (age) { where("age > ?", age)}

В моем контроллере users_controller.rb я использую функцию для фильтрации параметров:

def search 
 filter = params.slice(:age, :created_between, :identified)

 filter.each do |key, value|
   if value.present?
        @users = @users.public_send(key,value)
   else
        @users = @users.public_send(key)
   end
 end
end

Я различаю существующее значение или нет, поскольку: идентифицированная область видимости реализована в виде флажка и поэтому не передает значения, подобного

Наконец, я создал форму для всех возможные фильтры вот так, на мой взгляд. html .erb file:

<%= form_tag users_search_path, :method => :get, :enforce_utf8 => false do %>
  <%= date_field :created_between, "from" %>
  <%= date_field :created_between, "to" %>
  <%= check_box_tag :identified, '', false %>
  <%= text_field_tag :age, "age" %>
<% end %>

Фильтр по возрасту и выявленным работам. Когда я отправляю форму, запрос становится /users/search?identified=&created_between[from]=&created_between[to]=, когда я отмечаю только отмеченный флажок (поле date_ также пропускается, хотя я не отправлял дату). И /users/search?age=21&created_between[from]=&created_between[to]= когда я только представлю возраст.

Моя проблема заключается в , что всякий раз, когда я пытаюсь отправить две даты для области действия created_between, я получаю ошибку wrong number of arguments (1 given, expected 2). Я не уверен, что отправляю поля даты правильно.

Как я могу передать два необходимых параметра в область? Или я должен сделать это по-другому?

1 Ответ

0 голосов
/ 24 января 2020

Иногда простое написание вопроса, кажется, проясняет ситуацию. Однако, решение было изменить мою область видимости для :created_between на:

scope :created_between, -> (date) {where(created_at: date[:from]..date[:to])}
...