将多个命名范围与OR组合在一起

时间:2016-05-25 18:41:14

标签: ruby-on-rails ruby rails-activerecord named-scope

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

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)

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

2 个答案:

答案 0 :(得分:1)

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(:或))

答案 1 :(得分:1)

我还没有尝试在范围内使用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 query