1

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

我怎样才能做到这一点。

4

2 回答 2

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_tagsearch_form_for视图中包含 a :

 <%= number_field_tag :children_count_lt, params[:children_count_lt] %>

ransack通过控制器中的过滤器调用:

@q = Company.children_count_lt(params[:children_count_lt]).ransack(params[:q])
于 2013-12-06T19:57:08.560 回答
0

最好加上counter cache,不仅可以简化代码,还可以提高性能(相对),然后你只需要使用ransack:

Company.search(params[:q])

无需更改控制器中的任何内容。只需更改模型以添加计数器缓存:

class Company < ActiveRecord::Base
  has_many :children
end

class Child < ActiveRecord::Base
  belongs_to :company, counter_cache: true
end
于 2017-01-31T04:04:18.757 回答