ActiveRecord OR 查询哈希表示法
ActiveRecord OR query Hash notation
我知道有 3 种主要符号用于向 where
ActiveRecord 方法提供参数:
- 纯字符串
- 数组
- 哈希
为 where
方法指定 and
很简单:
# 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})
为相同的 where
方法指定 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» 的实现(最后两个有点像 hash-ish):
在 Rails 5 上使用 Ruby,您可以使用 ActiveRecord::Relation#or
方法进行以下链接:
Person.where(name: 'Neil').or(Person.where(age: 27))
使用where_values
together with reduce
. The unscoped
method is necessary only for Rails 4.1+确保default_scope
不包含在where_values
中。否则来自 default_scope
和 where
的谓词将与 or
运算符链接:
Person.where(
Person.unscoped.where(name: ['Neil'], age: [27]).where_values.reduce(:or)
)
安装实现这些或类似功能的第三方插件,例如:
Where Or (Ruby 对上述 Rails 5 .or
功能的反向移植)
-
Person.where{(name == 'Neil') | (age == 27)}
-
Person.where(name: 'Neil').or(age: 27)
-
Person.where.anyof(name: 'Neil', age: 27)
-
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 所说,您可以使用另一个 third-party 插件来实现此功能。我有很长时间使用 Squeel 并且在这方面工作得很好,还有更多功能,如复杂的子查询或连接。
使用 squeel 的查询:
@people= Person.where{(name == 'Neil') | (age = 27)}
我知道有 3 种主要符号用于向 where
ActiveRecord 方法提供参数:
- 纯字符串
- 数组
- 哈希
为 where
方法指定 and
很简单:
# 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})
为相同的 where
方法指定 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» 的实现(最后两个有点像 hash-ish):
在 Rails 5 上使用 Ruby,您可以使用
ActiveRecord::Relation#or
方法进行以下链接:Person.where(name: 'Neil').or(Person.where(age: 27))
使用
where_values
together withreduce
. Theunscoped
method is necessary only for Rails 4.1+确保default_scope
不包含在where_values
中。否则来自default_scope
和where
的谓词将与or
运算符链接:Person.where( Person.unscoped.where(name: ['Neil'], age: [27]).where_values.reduce(:or) )
安装实现这些或类似功能的第三方插件,例如:
Where Or (Ruby 对上述 Rails 5
.or
功能的反向移植)-
Person.where{(name == 'Neil') | (age == 27)}
-
Person.where(name: 'Neil').or(age: 27)
-
Person.where.anyof(name: 'Neil', age: 27)
-
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 所说,您可以使用另一个 third-party 插件来实现此功能。我有很长时间使用 Squeel 并且在这方面工作得很好,还有更多功能,如复杂的子查询或连接。
使用 squeel 的查询:
@people= Person.where{(name == 'Neil') | (age = 27)}