我正在尝试使用ransack gem根据关联计数过滤结果:
例如,每个班级有50名学生,所以我想过滤到只有20名学生的班级。
<%= search_form_for @q do |f| %>
<%= f.text_field :name_cont %>
<%= f.text_field :children_count_lt %>
<%= f.submit 'Filter' %>
<% end %>
@q = Company.ransack(params[:q])
@companies = @q.result.paginate(:page => params[:page], :per_page => 60)
我该怎么做。
答案 0 :(得分:2)
我不知道Ransack可以处理这种情况。但是你仍然可以在你的搜索表单中将这个条件和其他Ransack谓词一起应用,就像这样......
在模型中定义一个类方法,按子记录计数过滤:
def self.children_count_lt(count)
return Company.all if count.blank?
Company.includes(:students).group('companies.id').having("COUNT(students.id) < #{count.to_i}").references(:students)
end
在视图中的number_field_tag
中加入search_form_for
:
<%= number_field_tag :children_count_lt, params[:children_count_lt] %>
通过控制器中的过滤器调用ransack
:
@q = Company.children_count_lt(params[:children_count_lt]).ransack(params[:q])
答案 1 :(得分:0)
最好添加counter cache,不仅可以简化代码,还可以提高性能(相对),然后您只需要使用搜索:
first second
bar one 0.210911
two 0.628357
total -0.911331
baz two 0.315396
four -0.195451
five 0.060159
total 0.638313
dtype: float64
无需更改控制器中的任何内容。只需模型更改即可添加计数器缓存:
Company.search(params[:q])