使用Ransack gem的Rails根据关联计数过滤结果

时间:2013-10-03 12:16:19

标签: ruby-on-rails-4 ransack

我正在尝试使用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)

我该怎么做。

2 个答案:

答案 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])