3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Ransackで孫のモデルの検索をしたいときの書き方

Posted at

概要

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など)とすれば検索できるかと思うので、試してみてください。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?