【问题标题】:How to build a SQL 'OR' query by using Rails facilities?如何使用 Rails 工具构建 SQL 'OR' 查询?
【发布时间】:2012-06-05 18:10:49
【问题描述】:

我正在使用 Ruby on Rails 3.2.2,鉴于我已经说明了该问题涉及的所有需要​​的类/模型,我想构建以下 SQL 查询语句(注意 SQL OR)“a là Ruby在 Rails 上”:

SELECT customers.* FROM customers WHERE (firstname = 'James' OR firstname = 'Paula') AND lastname = 'Brown'

是否可以使用 Rails 工具?

【问题讨论】:

  • @tokland 我不这么认为。请参阅我的答案(和其他人)。
  • @Anil:嗯,我明白重点是如何进行 OR,而不是字段相同(那么确实可以使用 IN (?))。

标签: mysql sql ruby-on-rails ruby ruby-on-rails-3


【解决方案1】:

以下代码可以让您在 firstname 字段上获得与多个 ORs 相同的效果:

Customer.where(['firstname IN (?) AND lastname = ?', ['James', 'Paula'], 'Brown'])

【讨论】:

    【解决方案2】:

    如果您不想使用像 squeel 这样的任何外部 gem,一个很好的方法是为此目的构建一个范围:

    scope :by_first_and_last_name, ->(firsts, last) { 
       where(['firstname in (?) AND lastname = ?', firsts, last])
    }
    

    由于它返回一个 Arel,您可以将它与其他范围正常链接。

    你可以这样使用它:

    YourModel.by_first_and_last_name(['Foo','Bar'], 'Baz').first
    

    【讨论】:

    • metawhere 是 rails 2,您正在寻找 Ernie 的重写,称为 squeel github.com/ernie/squeel。在同一主题上,Ryan Bates 在最近的 Railscast(专业版)railscasts.com/episodes/355-hacking-with-arel 中提出了一些有趣的观点
    • @Fabrizio 他正在寻找(名字或名字)和姓氏。
    • @Anil 对不起,我误读了这个问题。为了保持一致,我会更新我的答案,但 IN 方法显然更好。
    【解决方案3】:

    您并不是真的在寻找 OR。相反,您正在寻找一个 IN。

    SELECT customers.* FROM customers WHERE firstname IN ('James','Paula') AND lastname = 'Brown'
    

    这在 Rails 中已经支持很长时间了(可能是从一开始)。您可以在查找结果中指定一个值数组而不是单个值。

    @firstnames = ['James','Paula']
    @lastname = 'Brown'
    @customers = Customer.find_all_by_firstname_and_lastname(@firstnames,@lastname)
    

    【讨论】:

    • 这些查找器将在 Rails 4 中被弃用。您应该改用 Customer.where(first_name: @firstnames, last_name: @lastname)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 2023-01-17
    • 2011-04-03
    • 2012-05-24
    相关资源
    最近更新 更多