我正在使用Rails3,ActiveRecord
只是想知道如何用OR语句而不是AND来链接范围.
例如
Person.where(:name => "John").where(:lastname => "Smith")
Run Code Online (Sandbox Code Playgroud)
这通常会返回name ='John'和lastname ='Smith',但我想:
name ='John'或lastname ='Smith'
activerecord ruby-on-rails ruby-on-rails-3 rails-activerecord
如何使用逻辑OR而不是AND组合2个不同的条件?
注意:作为轨道范围生成2个条件,并且不能轻易地将其更改为where("x or y")直接类似的条件.
简单的例子:
admins = User.where(:kind => :admin)
authors = User.where(:kind => :author)
Run Code Online (Sandbox Code Playgroud)
它很容易应用和条件(对于这个特殊情况是没有意义的):
(admins.merge authors).to_sql
#=> select ... from ... where kind = 'admin' AND kind = 'author'
Run Code Online (Sandbox Code Playgroud)
但是,如何生成具有2种不同Arel关系的以下查询?
#=> select ... from ... where kind = 'admin' OR kind = 'author'
Run Code Online (Sandbox Code Playgroud)
似乎(根据Arel自述文件):
OR运算符尚不支持
但是我希望它不适用于此并期望写出如下内容:
(admins.or authors).to_sql
Run Code Online (Sandbox Code Playgroud) 我想找到所有Annotations身体都是:
最好的方法是什么?
我想尽可能使用SearchLogic,但是SearchLogic允许您执行以下各项操作:
Annotation.body_equals('?')Annotation.body_like('[?]')你总是可以将它们连在一起: Annotation.body_equals('?').body_like('[?]')
我不确定如何将它们结合起来OR.
请注意,如果命名范围与参数相同,OR 则可以将它们组合在一起.我可以这样做:
Annotation.body_equals_or_body_like('?')
Run Code Online (Sandbox Code Playgroud)
但这没有用.
请注意,我没有附加到SearchLogic,但对于不需要破坏其抽象的解决方案来说,它会很棒.
我正在尝试合并两个范围或向现有范围添加更多内容。
scope :public_bids, -> {
where(status: [Status::ACCEPTED, Status::OUTBID, Status::SOLD, Status::NO_SALE],
bid_type: [BidType::MANUAL, BidType::AUTO, BidType::LIVE])
scope :outbid_maxbids, -> {
where(status: Status::OUTBID, bid_type: BidType::MAXBID)
Run Code Online (Sandbox Code Playgroud)
我无法确定如何将OR它们组合在一起或合并到一个范围中。有什么建议/指导吗?我更希望将它们合并到一个范围中。