在Rails 5中有什么方法可以使用范围的相反(否定)? 例如,鉴于我有以下范围
scope :missing_coordinates, -> { where(latitude: [nil, '']).or(where(longitude: [nil, ''])) }
有什么方法可以使用与该范围相反的方式,如:
Places.not(missing_coordinates)
会返回那些同时具有纬度和经度的那些?
答案 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) }