Rails 5,范围与另一个范围相反

时间:2018-06-13 19:15:27

标签: ruby-on-rails

在Rails 5中有什么方法可以使用范围的相反(否定)? 例如,鉴于我有以下范围

scope :missing_coordinates, -> { where(latitude: [nil, '']).or(where(longitude: [nil, ''])) }

有什么方法可以使用与该范围相反的方式,如:

Places.not(missing_coordinates)

会返回那些同时具有纬度和经度的那些?

3 个答案:

答案 0 :(得分:1)

尝试一下!

scope :not, ->(scope_name) { query = self
          send(scope_name).joins_values.each do |join|
          query = query.joins(join)
        end
                                        query.where((send(scope_name).where_clause.send(:predicates).reduce(:and).not))}

用法

Model.not(:scope_name)

答案 1 :(得分:0)

如何创建一个获取整个集合的方法,并减去missing_coordinates

self.not_missing_coordinates
    Places.all - Places.missing_coordinates
end

这可让您拨打Places.not_missing_coordinates。我环顾了文档,找不到任何与你所描述的方式相反的范围。

答案 2 :(得分:0)

没有内置解决方案,但您可以将params传递到范围:

scope :missing_coordinates, ->(missing = true){ missing ?
       where(latitude: [nil, '']).or(where(longitude: [nil, ''])) :
       where.not(latitude: '').where.not(longitude: '') 
}

呼叫:

Places.missing_coordinates
Places.missing_coordinates(false) #opposite

或者您可以按如下方式定义两个范围:

scope :missing_coordinates, -> { where(latitude: [nil, '']).or(where(longitude: [nil, '']))}
scope :not_missing_coordinates, -> { where.not(id: missing_coordinates) }