将多个命名范围与OR组合

我正在尝试组合两个范围或向现有范围添加更多范围。

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) 

我无法确定如何将它们组合在一起或者将它们合并到一个范围内。 有什么建议/指导吗? 我希望将它们组合成一个单一的范围。

Rails 4及更早版本不支持“本地” OR查询。 看起来它将在Rails 5中引入。

现在,您必须使用.where方法:

 YourModel.where('field1 = ? OR field2 = ?', 1, 2) 

但是,在您的情况下,您正在选择使用IN=查询,并且第一个字段位于两个范围中。 所以,这没有多大意义。 无论如何,如果你真的需要,你可能会逃避这个 :

 data = YourModel.public_bids.outbid_maxbids YourModel.where(data.where_values.inject(:or)) 

我没有尝试使用or在范围内,但您可以使用Rails 5的新方法or方法将范围链接在一起,如下所示:

 scope :public_or_outbid, -> { where(status: [Status::ACCEPTED, Status::OUTBID, Status::SOLD, Status::NO_SALE], bid_type: [BidType::MANUAL, BidType::AUTO, BidType::LIVE])\ .or(where(status: Status::OUTBID, bid_type: BidType::MAXBID)) } 

(请注意,这仅适用于Rails 5)

你当然可以把这些条件联系起来:

 MyObj.public_bids.or(MyObj.outbid_maxbids) 

有关更多详细信息,请参阅此答案: Rails 5:ActiveRecord OR查询