ActiveRecord或查询散列符号
我知道有3个主要的符号为ActiveRecord方法提供参数:
- 纯string
- 排列
- 哈希
指定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})
指定or
相同的方法是为我的哈希语法。 可能吗?
# 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})
有5个选项可以被认为是“哈希符号”(Hash notation)的实现(最后两个是有点哈希):
-
使用Ruby on Rails 5,您可以使用
ActiveRecord::Relation#or
方法执行以下链接:Person.where(name: 'Neil').or(Person.where(age: 27))
-
将
where_values
与where_values
一起使用。 只有Rails 4.1+才能使用where_values
方法来确保default_scope
不包含在where_values
。 否则,来自两个default_scope
谓词以及与or
运算符链接的where
:Person.where( Person.unscoped.where(name: ['Neil'], age: [27]).where_values.reduce(:or) )
-
安装实现这些或类似function的第三方插件,例如:
-
在哪里 (上面提到的Ruby on Rails 5
.or
function的backport) -
Squeel
Person.where{(name == 'Neil') | (age == 27)}
-
RailsOr
Person.where(name: 'Neil').or(age: 27)
-
ActiverecordAnyOf
Person.where.anyof(name: 'Neil', age: 27)
-
SmartTuple
Person.where( (SmartTuple.new(' or ') << {name: 'Neil', age: 27}).compile )
-
-
使用Arel :
Person.where( Person.arel_table[:name].eq('Neil').or( Person.arel_table[:age].eq(27) ) )
-
使用具有命名参数的预准备语句
Person.where('name = :name or age = :age', name: 'Neil', age: 27)
正如Potashin所说,您可以使用其他第三方插件来实现此function。 我有很长一段时间使用Squeel和这个和更复杂的子查询或联接function很好。
该查询使用squeel:
@people= Person.where{(name == 'Neil') | (age = 27)}