Мой Filterrific фильтр не работает - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь внедрить Filterrific в свое приложение для фильтрации пользователей.Мне нужно отфильтровать по mother_tongue, местонахождению и доступности start_time.Но это не работает.Нет ошибок, но нет фильтрации ...

Модель user.rb:

filterrific(
  default_filter_params: {},
  available_filters: [
    :search_query,
    :search_query,
    :with_start_time_gte
  ]
 )

scope :search_query, lambda { |query|
  return nil  if query.blank?

  terms = query.downcase.split(/\s+/)

  terms = terms.map { |e|
    (e.gsub('*', '%') + '%').gsub(/%+/, '%')
  }
  num_or_conditions = 2
  where(
    terms.map {
      or_clauses = [
          "LOWER(users.mother_tongue) LIKE ?",
          "LOWER(users.locality) LIKE ?"
      ].join(' OR ')
      "(#{ or_clauses })"
    }.join(' AND '),
    *terms.map { |e| [e] * num_or_conditions }.flatten
  )
}

scope :with_start_time_gte, lambda { |ref_date|
  where('availability.start_time >= ?', ref_date)
}

Users_controller.rb:

def index
  @filterrific = initialize_filterrific(
    User,
    params[:filterrific]
    #persistence_id: 'shared_key',
    #default_filter_params: {},
    #available_filters: [],
  ) or return
  @users = @filterrific.find.page(params[:page])

  # Respond to html for initial page load and to js for AJAX filter updates.
  respond_to do |format|
    format.html
    format.js
  end

  rescue ActiveRecord::RecordNotFound => e
    # There is an issue with the persisted param_set. Reset it.
    puts "Had to reset filterrific params: #{ e.message }"
    redirect_to(reset_filterrific_url(format: :html)) and return
end

index.html.erb:

<% provide(:title, 'Liste des utilisateurs') %>
<h1>Liste des utilisateurs :</h1>

<%= form_for_filterrific @filterrific, html: { id: 'filterrific-no-ajax-auto-submit' } do |f| %>
<div>
  Langue :
  <%= f.text_field(
  :search_query,
  class: 'mother_tongue filterrific-periodically-observed'
) %>
</div>
<div>
  Ville :
    <%= f.text_field(
  :search_query,
  class: 'locality filterrific-periodically-observed'
) %>
</div>
<div>
  Date de départ :
    <%= f.text_field(:with_start_time_gte, class: 'js-datepicker') %>
</div>

<%= f.submit 'Rechercher' %>

<div>
  <%= link_to(
   'Reset filters',
  reset_filterrific_url,
) %>
</div>

<%= render_filterrific_spinner %>

_list.html.erb:

<div id="filterrific_results">

<div>
<%= page_entries_info users %>
</div>

<% @users.each do |user| %>
  <h1><%= user.fname %> <%= user.lname %></h1>
    <h2><%= user.mother_tongue %></h2>
  <center>
    <p><%= user.postal_code %> <%= user.locality %></p>

    <p><%= link_to "En savoir plus", user_path(user) %></p>
  </center>
<% end %>

Я новичок на рельсах, поэтому спасибо за вашу помощь.

1 Ответ

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

Метод, который вы использовали, scope :search_query..., предназначен для поиска входного текста в одном из двух указанных вами столбцов базы данных, users.mother_tongue и users.locality.В результате полученное предложение where будет "WHERE LOWER(users.mother_tongue) LIKE ? OR LOWER(users.locality) LIKE ?".

. Если вы хотите отфильтровать значения 2 полей отдельно, вы должны определить 2 поля ввода с разными именами, 2 фильтра и 2 области действия.

Код может быть таким:

Модель user.rb:

filterrific(
  default_filter_params: {},
  available_filters: [
    :with_mother_tongue,
    :with_locality,
    :with_start_time_gte
  ]
)

scope :with_mother_tongue, -> (search_string) {
  where("users.mother_tongue ILIKE ?", (search_string.to_s.gsub('*', '%') + '%').gsub(/%+/, '%'))
}

scope :with_locality, -> (search_string) {
  where("users.locality ILIKE ?", (search_string.to_s.gsub('*', '%') + '%').gsub(/%+/, '%'))
}

scope :with_start_time_gte, lambda { |ref_date|
  where('availability.start_time >= ?', ref_date)
}

В индексном представлении вы также должны визуализировать _list частично (см. В конце):

index.html.erb:

<% provide(:title, 'Liste des utilisateurs') %>
<h1>Liste des utilisateurs :</h1>

<%= form_for_filterrific @filterrific, html: { id: 'filterrific-no-ajax-auto-submit' } do |f| %>
<div>
  Langue :
  <%= f.text_field(
  :with_mother_tongue,
  class: 'mother_tongue filterrific-periodically-observed'
) %>
</div>
<div>
  Ville :
    <%= f.text_field(
  :with_locality,
  class: 'locality filterrific-periodically-observed'
) %>
</div>
<div>
  Date de départ :
    <%= f.text_field(:with_start_time_gte, class: 'js-datepicker') %>
</div>

<%= f.submit 'Rechercher' %>

<div>
  <%= link_to(
   'Reset filters',
  reset_filterrific_url,
) %>
</div>

<%= render_filterrific_spinner %>    

#filterrific_results
  = render 'users/list', users: @users

И, наконец, вам нужно определить представление js, вызываемое действием index в контроллере, когда вы фильтруете записи, заполняющие хотя бы одну изфильтрует поля ввода:

index.js.erb

<% js = escape_javascript (
  render(partial: 'users/list', locals: {users: @users})
) %>
$("#filterrific_results").html("<%= js %>");
...