概要
Ransackを使っていると子のモデルのさらに子が持つフィールドで検索したくなることが結構あるのではないかと思います。
公式のREADMEを軽く読んでもそのような方法を実現するコード例が見当たらなかったので、記事にしてみようと思います。
方法
例として特定のタグを持つ記事を書いたユーザーを検索したい場合などを例にしてみようと思います。
モデル構造は下記のような形です。
models/user.rb
class User
has_many :posts, dependent: :destroy
end
models/post.rb
class Post
has_many :post_categories, dependent: :destroy
has_many :categories, through: :post_categories
end
models/category.rb
class Category
has_many :post_categories, dependent: :destroy
has_many :posts, through: :post_categories
end
models/post_category.rb
class PostCategory
belongs_to :post
belongs_to :category
end
この時ユーザー一覧ページで特定のカテゴリの記事を書いたユーザーを検索するには下記のように記述します。
なおCategory
はnameというカラムをカテゴリ名として持っているとします。
views/users/index.html.slim
form
= search_form_for @q, url: users_path do |f|
.form-group
= f.label :posts_categories_id_eq, "記事カテゴリで検索"
= f.collection_select :posts_categories_id_eq, Category.all, :id, :name, {include_blank: true}, class: 'form__field'
.form-group
= f.submit "検索", class: 'button button--primary mr-2'
フィールド名を子テーブル名_孫テーブル名_孫テーブルのフィールド名_検索方法(eq, contなど)
とすれば検索できるかと思うので、試してみてください。