LoginSignup
2
2

More than 3 years have passed since last update.

[Rails] or を inject でチェーンする

Last updated at Posted at 2019-09-09

app/models/character.rb
class Character < ApplicationRecord
  enum sex: { male: 1, female: 2 }

  scope :by_name, (lambda do |*names|
    names.inject(none) do |relation, name|
      relation.or(where("#{table_name}.name LIKE ?", "%#{name}%"))
    end
  end)
end
Character.female.by_name('さ', '杏').pluck(:name)
# SELECT characters.name FROM characters
# WHERE characters.sex = 2
# AND (((characters.name LIKE '%さ%') OR ((characters.name LIKE '%杏%'))
#=> ["百江なぎさ", "美樹さやか", "佐倉杏子"]

解説

Enumerable#inject の第 1 引数の none がポイント。noneself にすると

# ALL or 条件 1 or 条件 2 or ...
Character.all.or(Character.where('条件 1')).or(Character.where('条件 2'))).or(...)

と解釈されて、その結果 OR 条件が消えてしまう。

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