gem Ransack пользовательский поиск только год вместо полной даты - PullRequest
0 голосов
/ 08 июня 2018

У меня есть приложение Rails 5.1 и форма поиска Ransack с выпадающим списком, содержащим некоторые столбцы базы данных.Один из столбцов - finish_date и имеет значения в формате, например, «2007-12-31».В поле ввода мне нужно ввести точно полную дату, чтобы получить совпадение, но я хочу изменить поведение, так как оно принимает только год в качестве входного значения.

Как я могу передать пользовательский предикат, который преобразуетвходное значение от полной даты, например.2007-12-31 только год?

Я ищу Ransack-эквивалент для запроса sql:

SELECT *
 FROM imagecapturing
 WHERE YEAR(finish_date) = 2007

Моя форма Ransack:

<%= search_form_for @search do |f| %>
  <%= f.grouping_fields(f.object.new_grouping) do |g| %>
    <%= g.condition_fields(g.object.new_condition) do |c| %>
      <%= c.predicate_select only: %i(cont not_eq eq) %>
      <%= c.value_fields do |v| %>
        <%= v.text_field :value %>
      <% end %>
    <% end %>
  <% end %>
  <%= f.submit "filter" %>
<% end %>

в моем контроллере:

  @search = Imagecapturing.ransack params[:q]
  @imagecapturings = @search.result.page params[:page]

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Использовать Ransacker:

Вы можете написать что-то вроде этого в вашей модели:

  ransacker :custom_years do |args|
    query = <<-SQL
      Year(finish_date)
    SQL
    Arel.sql(query)
  end

См. Также использование Ransacker в Ransack Wiki

0 голосов
/ 08 июня 2018

Похоже, что вы можете достичь необходимых результатов, используя области.Вы можете увидеть тестовый проект, который я создал здесь: https://github.com/wmavis/so_rails_ransack

В документации приведен пример использования областей: https://github.com/activerecord-hackery/ransack/#using-scopesclass-methods

Я добавил следующее в свою модель Imagecapturing:

  def self.finish_year(year)
    where("strftime('%Y', finish_date) = ?", year)
  end

  def self.ransackable_scopes(auth_object = nil)
    %i(finish_year)
  end

(мне пришлось использовать strftime, потому что мой тестовый проект использовал sqlite, но вы можете изменить его на YEAR (finish_date), как вы хотели)

В представлении я просто используюполе поиска с именем finish_year:

  <%= f.label :finish_year %>
  <%= f.search_field :finish_year %>

Дайте мне знать, если у вас возникнут проблемы с его работой.

...