我试图制作一个范围,将我在数组中发送的至少一种用途的所有建筑物作为参数带回来。
我的建筑模型有一个types_of_use
列,其属性为array: true
我怎样才能制作一个范围来检查我发送的至少一个值是否在数组中并将结果保存为ActiveRecord_Relation
?
Building.first.types_of_use # Returns ["Offices", "Comercial"]
uses = ["Hotel", "Comercial"]
Building.with_uses(uses) # Should return the first building
答案 0 :(得分:4)
如果这是PostgreSQL,那么您想要使用&&
(overlaps) operator:
&&
重叠(具有共同的要素)
ARRAY[1,4,3] && ARRAY[2,1]
t
您还想使用array constructor syntax:
array[?]
因为ActiveRecord喜欢将值为数组的占位符扩展为逗号分隔值列表。
将它们放在一起,你的范围可能如下:
def self.with_uses(uses)
where('buildings.types_of_use && array[?]', uses)
end
或者,如果您更喜欢使用scope
方法来定义范围:
scope :with_uses, ->(uses) { where('buildings.types_of_use && array[?]', uses) }
但"Using a class method is the preferred way to accept arguments for scopes"所以我通常对带参数的作用域使用显式类方法。