ActiveRecord 按值对查询

Gra*_*ick 2 sql activerecord ruby-on-rails rails-activerecord ruby-on-rails-5

我正在使用 Rails 5.1+,我想根据两个条件查询模型,它可以有多个值,但总是两个两个。

假设我有一个User模型,它有一个first_namelast_name。我正在寻找具有以下任一特征的用户:

first_name: "John"
last_name: "Doe"
Run Code Online (Sandbox Code Playgroud)

或者

first_name: "Jane"
last_name: "Snow"
Run Code Online (Sandbox Code Playgroud)

我怎样才能写一个指定这个的查询?我总是可以生成一个 SQL 查询字符串,我会传递给一个where子句,但我想知道是否有更好的方法。

pot*_*hin 5

您可以尝试在模型中定义辅助方法并使用or方法(未测试):

class User
  def self.where_in_pairs(values = [])
    values.map { |(first_name, last_name)| 
      where(first_name: first_name, last_name: last_name) 
    }.reduce(:or)
  end
end
Run Code Online (Sandbox Code Playgroud)

并像这样调用:

User.where_in_pairs([["John", "Doe"], ["Jane", "Snow"]])
Run Code Online (Sandbox Code Playgroud)

您也可以为此使用普通的 arel(已测试):

class User
  def self.where_in_pairs(values = [])
    where(
      values.map { |(first_name, last_name)| 
        arel_table[:first_name].eq(first_name).and(
          arel_table[:last_name].eq(last_name)
        ) 
      }.reduce(:or)
    }
  end
end
Run Code Online (Sandbox Code Playgroud)