将多个命名作用域与 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)

我无法确定如何将它们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:活动记录或查询

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

现在,您必须将SQL与.where方法一起使用:

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

但是,在您的情况下,您正在选择使用 IN= 查询,并且第一个字段在两个范围内。所以,这没有多大意义。无论如何,如果你真的必须这样做,你可能会侥幸逃脱:

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

最新更新