酒と泪とRubyとRailsと

Ruby on Rails と Objective-C は酒の肴です!

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

Where?

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


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

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

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

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

User.rb
1
2
3
4
class User < ActiveRecord::Base
  attr_protected :id
  scope :search_names_or, lambda { |search_word| where("family_name = ? or first_name = ?", search_word, search_word) }
end

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

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

User.rb
1
2
3
4
5
6
7
8
9
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条件を組み合わせます。

Special Thanks

説明は以上です。いかがだったでしょうか?
もし、説明がわかりにくかったり、間違っている場所があればぜひ一言!

おすすめの書籍