Nei*_*eil 72 activerecord ruby-on-rails ruby-on-rails-4 rails-activerecord ruby-on-rails-5
我知道有三个主要的符号为whereActiveRecord方法提供参数:
指定and的where方法是直截了当:
# Pure String notation
Person.where("name = 'Neil' AND age = 27")
# Array notation
Person.where(["name = ? AND age = ?", 'Neil', 27])
# Hash notation
Person.where({name: "Neil", age: 27})
Run Code Online (Sandbox Code Playgroud)
or为这个相同的where方法指定是为了哈希语法.可能吗?
# Pure String notation
Person.where("name = 'Neil' OR age = 27")
# Array notation
Person.where(["name = ? OR age = ?", 'Neil', 27])
# Hash notation DOESN'T WORK
Person.where({name: "Neil" OR age: 27})
Run Code Online (Sandbox Code Playgroud)
pot*_*hin 141
有可能被视为«哈希符号»(最后两个还挺散列实现5个选项ISH):
使用Ruby on Rails 5,您可以使用以下ActiveRecord::Relation#or方法进行链接:
Person.where(name: 'Neil').or(Person.where(age: 27))
Run Code Online (Sandbox Code Playgroud)使用where_values一起reduce.该unscoped方法仅适用于Rails 4.1+以确保default_scope不包含在where_values.否则,从两个谓词default_scope和where将与被链接or操作:
Person.where(
Person.unscoped.where(name: ['Neil'], age: [27]).where_values.reduce(:or)
)
Run Code Online (Sandbox Code Playgroud)安装实现这些或类似功能的第三方插件,例如:
Where Or (.or上面提到的Ruby on Rails 5 功能的后端)
Person.where{(name == 'Neil') | (age == 27)}
Run Code Online (Sandbox Code Playgroud)Person.where(name: 'Neil').or(age: 27)
Run Code Online (Sandbox Code Playgroud)Person.where.anyof(name: 'Neil', age: 27)
Run Code Online (Sandbox Code Playgroud)Person.where(
(SmartTuple.new(' or ') << {name: 'Neil', age: 27}).compile
)
Run Code Online (Sandbox Code Playgroud)使用Arel:
Person.where(
Person.arel_table[:name].eq('Neil').or(
Person.arel_table[:age].eq(27)
)
)
Run Code Online (Sandbox Code Playgroud)使用带有命名参数的预准备语句
Person.where('name = :name or age = :age', name: 'Neil', age: 27)
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
20157 次 |
| 最近记录: |