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条件を組み合わせます。

🚜 参考リンク

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

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

📚 おすすめの書籍