0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Railsで任意の数のキーワードをOR検索したい、なおかつeachだけでまとめたい

Last updated at Posted at 2021-06-29

この記事は一旦雑にアウトプットしているので、別途書き直したい

この記事の内容

eachのみにしたいが、firstが入り込んでしまうのでうーんとなる
初期値にModel.noneを用いることで解消できるという話

具体例

愚直に書くとfirstが入り込んでしまう

User.rb
# @param [Array<String>] words
# @return [ActiveRecord::Relation]
def find_by_keywords(words)
  query = User.where(name: words.first)
  words.each do |w|
    query.or(User.where(name: w))
  end
  query.merge(User.where(is_active: true)) # その他に条件がある場合はmergeすることがある
end

eachにすべてまとめてfirstをなくすには、以下のようにnoneを使うと解消できる
※ noneが入ってくることに違和感はある...

User.rb
# @param [Array<String>] words
# @return [ActiveRecord::Relation]
def find_by_keywords(words)
  query = User.none
  words.each do |w|
    query.or(User.where(name: w))
  end
  query.merge(User.where(is_active: true)) # その他に条件がある場合はmergeすることがある
end

なんでそんなことになるの?

あとで書く

備考

状態をもたないActiveRecord::Relationが生成できれば良さそうなので、他にも方法はありそう?

  • query = ActiveRecord::Relation.new な状態が作れればよいのでは?
0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?