制作范围条件检查数组是否至少包含另一个数组的一个元素

时间:2018-02-18 04:24:39

标签: ruby-on-rails arrays ruby activerecord rails-activerecord

我试图制作一个范围,将我在数组中发送的至少一种用途的所有建筑物作为参数带回来。

我的建筑模型有一个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

1 个答案:

答案 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"所以我通常对带参数的作用域使用显式类方法。