LoginSignup
2
3

More than 5 years have passed since last update.

[Rails]Reference型の持つカラムをKeyにしてあいまい検索をしたかった

Last updated at Posted at 2018-07-18

背景

Reference型の持つカラムをKeyにして、LIKEによるあいまい検索をしようとしたところ、全然一筋縄でいかなかった。

Model

UserモデルとItemモデルを以下のように設計した

User
├─ t.integer   :user_id
└─ t.string    :user_name

Item
├─ t.integer   :item_id
└─ t.reference :user

欲しかったもの

例えば、検索バーに「田中」と入力した時に
「田中」を含むuser_nameのuserを:userとして持っているItemの一覧を、Item.allから抽出したかった

が、これが簡単ではなく

@item = Item.where("user.user_name LIKE ?", "%#{query}%")

とかで上手くいかないかな〜と試してみても全然ダメだった。Rails初心者の実力では、似たような探し方を複数試しても全く上手くいかず…
「rails reference where」などで検索をかけても全然解決法が見つからないので、自力で解決することにした。

解決まで

投げられたクエリでUserからあいまい検索する方法はコレ

User.where("user_name LIKE ?", "%#{query}%")

また、もし検索結果の中に含まれるuser_idのリストが手に入れば、そのuser_idの:userを持っているItemオブジェクトはコレで抽出できる

Item.where(:user_id => [user_idのリスト])

そして、あいまい検索した結果のidをリスト型で整形する事はplunkメソッドで可能

User.where("user_name LIKE ?", "%#{query}%").plunk(:id)

正解

以上の結果から、queryの文字列を含む名前のuserを、Reference型の:userとして持っている、Itemの一覧を抽出する方法は以下の通りになる。

Item.where(:user_id => User.where("user_name LIKE ?", "%#{query}%").pluck(:id))

解決して良かった〜〜〜

2
3
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
2
3