Combining multiple named scopes with OR

后端 未结 2 1032
旧时难觅i
旧时难觅i 2020-12-12 01:26

I am trying to combine two scopes or add some more to an existing scope.

scope :public_bids, -> {
  where(status: [Status::ACCEPTED, Status::OUTBID, Statu         


        
相关标签:
2条回答
  • 2020-12-12 01:48

    Rails 4 and older do not support OR query "natively". Looks like it will be introduced in Rails 5.

    For now, you would have to use SQL with .where method:

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

    But, in your case, you are selecting using IN and = queries and the first field is in both scopes. So, it would not make much sense. Anyway, if you really have to, you might get away with this:

    data = YourModel.public_bids.outbid_maxbids
    YourModel.where(data.where_values.inject(:or))
    
    0 讨论(0)
  • 2020-12-12 01:54

    I haven't tried using or in a scope, but you may be able to chain the scopes together using Rails 5's new or method, like this:

    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))
    }
    

    (Note that this only works in Rails 5)

    You certainly can chain the conditions together like this:

    MyObj.public_bids.or(MyObj.outbid_maxbids)
    

    See this answer for more detail: Rails 5: ActiveRecord OR query

    0 讨论(0)
提交回复
热议问题