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_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])
于 2013-12-06T19:57:08.560 に答える
0

counter cacheを追加することをお勧めします。コードを簡素化するだけでなく、パフォーマンス (相対) にも役立ちます。その後、ランサックを使用するだけで済みます。

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 に答える