背景
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))
解決して良かった〜〜〜