Rails whereで複数カラムのOR条件を作成する


RailsのActive Recordのwhere条件で、「複数カラムのどれかに一致していればOK」という条件を作る方法です。たとえば、性カラムと名カラムが別れたUserに対して、どちらでもいいので検索文字がヒットしてほしいというパターンのwhere条件です。


🎂 検索対象のカラムが固定されている場合(静的)

Userテーブルが、次のような定義だったとします。

User
  id: integer
  family_name: string
  first_name: string
  created_at: datetime
  updated_at: datetime

すでにOR条件の対象となるカラムが固定されている場合は、次のようなコードになります。

class User < Active Record::Base
attr_protected :id
scope :search_names_or, lambda { |search_word| where("family_name = ? or first_name = ?", search_word, search_word) }
end

🚕 検索対象のカラムを動的に変更したい場合

OR条件での検索対象のカラムを動的に変更する場合のコードは次のとおりです。

class User < ActiveRecord::Base
scope :search_fields_or, lambda { |fields, search_word|
fields = [fields] if fields.class == Symbol

cond = nil
fields.each { |field| cond = cond ? cond.or(arel_table[field].eq(search_word)) : arel_table[field].eq(search_word) }
where(cond)
}
end

Arelで動的にWHERE文のOR条件を組み合わせます。

🏈 参考リンク

説明は以上です。いかがだったでしょうか?

もし、説明がわかりにくかったり、間違っている場所があればぜひ一言!

🖥 VULTRおすすめ

VULTR」はVPSサーバのサービスです。日本にリージョンがあり、最安は512MBで2.5ドル/月($0.004/時間)で借りることができます。4GBメモリでも月20ドルです。 最近はVULTRのヘビーユーザーになので、「ここ」から会員登録してもらえるとサービス開発が捗ります!

📚 おすすめの書籍