Объединение нескольких именованных областей с ИЛИ

Я пытаюсь объединить две области или добавить еще несколько к существующей области.

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 ответа

Я не пробовал использовать 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 ИЛИ запрос

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))
Другие вопросы по тегам