两张桌子的过滤宝石

时间:2019-04-03 19:25:07

标签: ruby-on-rails rubygems ruby-on-rails-5 filterrific

我正在使用有过滤效果的gem在我的应用中添加过滤器。我有父母桌和孩子桌。在children_list页面上,该页面显示所有具有其名字和其父母名字的孩子的列表。我面临的问题是在搜索查询中,我也想添加parent.firstname搜索以进行过滤。我尝试添加如下联接:-

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 :(得分:0)

AFAIK,您不能在同一页面上过滤两个单独的类。它将使用最后定义的过滤实例。遇到此问题时,我使用了带有自定义操作/路线的远程表单

# 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.erbfilter_childrens.js.erb文件

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