Filterrific Gem для двух столов - PullRequest
0 голосов
/ 03 апреля 2019

Я использую filterrific gem для добавления фильтров в мое приложение.У меня есть родительский стол и детский стол.На странице children_list, которая отображает список всех детей с их именем и именем их родителя.Проблема, с которой я сталкиваюсь, заключается в поисковом запросе, который я хочу добавить для поиска parent.firstname, а также для filterrific.Я попытался добавить соединение, как показано ниже: -

num_or_conds = 2
 joins(child: :parent).where(
   terms.map { |term|
    "(LOWER(children.firstname) LIKE ?) OR (LOWER(parents.firstname) LIKE ?) "

Но это не помогло.Любая идея, как этого достичь.

parent.rb

    has_many :children

child.rb

belongs_to :parent

filterrific(
    available_filters: [
      :search_query,
      :with_clinic_date
    ]
  )

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

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

    terms = terms.map { |e|
      (e.gsub('*', '%') + '%').gsub(/%+/, '%')
    }

    num_or_conds = 2
    where(
      terms.map { |term|
        "(LOWER(children.firstname) LIKE ?) OR (LOWER(parents.firstname) LIKE ?)"
      }.join(' AND '),
      *terms.map { |e| [e] * num_or_conds }.flatten
    )
  }

  scope :with_clinic_date, lambda { |ref_date|
    where('children.clinic_date = ?', ref_date)
  }

end

_children.html.erb

<h1>Children</h1>
  <div class="table-responsive">
    <table class="table table-bordered">
      <thead>
        <tr>
          <th>Parent First Name</th> 
          <th>Child firstname</th>

        </tr>
      </thead>

      <tbody>
        <% @children.each do |child| %>
          <tr>
            <td><%=child.parent.firstname %></td>
            <td><%=child.firstname %></td>
          </tr>
        <% end %>
      </tbody>
    </table>
  </div> 
</div>

children-list.html.erb

<%= form_for_filterrific @filterrific do |f| %>
  <div class="row">
    <div class="col-sm-3">
      Search
      <%= f.text_field(
        :search_query,
        class: 'filterrific-periodically-observed form-control'
      ) %>
    </div>
    <div class="col-sm-3">
      Request Date
      <%= f.date_field(:with_clinic_date, class: 'js-datepicker form-control') %>
    </div>

    <div class="col-sm-3">
    <br>
    <%= link_to(
      'Reset filters',
      reset_filterrific_url,
    ) %>
  </div>
</div>
  <%= render_filterrific_spinner %>
<% end %>
<%= render( partial: 'children/children_list') %>

children.js.erb

<% js = escape_javascript(
  render(partial: 'children/children_list')
) %>
$("#filterrific_results").html("<%= js %>");

1 Ответ

0 голосов
/ 04 апреля 2019

AFAIK, вы не можете фильтровать два отдельных класса на одной странице. Он будет использовать последний определенный экземпляр filterrific. Когда я столкнулся с этой проблемой, я использовал удаленные формы с настраиваемым действием / маршрутами

# routes.rb
resources :parent do
  get :filter_parents
  resources: children do
    get :filter_children
  end
end

А потом контроллеры ..

# parents_controller.rb
def index
  parents_filter # this would be a helper method running your filter queries
end

def filter_parents
  parents_filter # this would be a helper method running your filter queries
end

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

А затем используйте частичное для таблицы. Выберите целевой контейнер и используйте файл filter_parents.js.erb и filter_childrens.js.erb

.
$('#parents-table').html('<%= escape_javascript render 'path/to/partial'%>')
// same in childrens.js.erb, just target the appropriate table
...