Ruby on rails 将Rails 5枚举与PG数组一起使用

Ruby on rails 将Rails 5枚举与PG数组一起使用,ruby-on-rails,Ruby On Rails,我正在尝试使用PostgreSQL的数组列 class Post < ActiveRecord::Base enum tags: { a: 0, b: 1, c: 2 }, array: true end 错误是: /usr/local/var/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.1.4/lib/active_record/enum.rb:172:in `block (2 levels) in en

我正在尝试使用PostgreSQL的数组列

class Post < ActiveRecord::Base
  enum tags: { a: 0, b: 1, c: 2 }, array: true
end
错误是:

/usr/local/var/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.1.4/lib/active_record/enum.rb:172:in `block (2 levels) in enum': undefined method `each_with_index' for true:TrueClass (NoMethodError)
    from /usr/local/var/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.1.4/lib/active_record/enum.rb:171:in `module_eval'
    from /usr/local/var/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.1.4/lib/active_record/enum.rb:171:in `block in enum'
    from /usr/local/var/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.1.4/lib/active_record/enum.rb:154:in `each'
    from /usr/local/var/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.1.4/lib/active_record/enum.rb:154:in `enum'
    from guides/bug_report_templates/active_record_gem.rb:38:in `<class:Product>'
    from guides/bug_report_templates/active_record_gem.rb:37:in `<main>'
/usr/local/var/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.1.4/lib/active\u record/enum.rb:172:in`block(2个级别)in enum:true:TrueClass(NoMethodError)的未定义方法`each\u with\u index')
从/usr/local/var/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.1.4/lib/active\u record/enum.rb:171:“模块评估”中
from/usr/local/var/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.1.4/lib/active_record/enum.rb:171:in`block in enum'
from/usr/local/var/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.1.4/lib/active_record/enum.rb:154:在'each'中
from/usr/local/var/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.1.4/lib/active_record/enum.rb:154:在“enum”中
来自guides/bug\u report\u templates/active\u record\u gem.rb:38:in`'
来自guides/bug\u report\u templates/active\u record\u gem.rb:37:in`'
Rails 5++

rails generate migration AddTypeDeliveryToProducts type_delivery:integer

class AddTypeDeliveryToProducts < ActiveRecord::Migration[5.1]
  def change
    add_column :products, :type_delivery, :integer, array:true, default: [], limit: 8
  end
end

class Product < ApplicationRecord
  enum type_delivery: { a: 1, b: 2, c: 3, d: 4 }
end
rails生成迁移AddTypeDeliveryToProducts类型\交付:整数
类AddTypeDeliveryToProducts
由于这个问题仍然没有答案,所以可以这样做:

首先,在
enum
方法上没有
array:true
选项,只需将其忽略即可

第二,添加自定义范围以检索与交付匹配的产品

scope :with_delivery_type, ->(*delivery_types) do
  normalized = Array(delivery_types).flatten
  where('delivery_types @> ?', "{#{normalized.join(',')}}")
end

最后但并非最不重要的一点是,我建议使用字符串或Postgres枚举类型而不是整数列。整数列是有问题的,因为对于一个来说,要读取它,需要写入记录的应用程序的源代码(插入时的版本),其次,删除或替换值是不必要的困难。

Rails'
enum
api将属性映射到单个整数列。如果需要,可以创建自己的位掩码以支持多个属性()


我认为您正在寻找的是,您甚至可以实现一个定制的ActiveRecord::Type来处理验证。

您可以使用仅为此用例创建的
array\u enum
gem

您的代码不起作用。请看我对这个问题的编辑。你找到解决办法了吗?
scope :with_delivery_type, ->(*delivery_types) do
  normalized = Array(delivery_types).flatten
  where('delivery_types @> ?', "{#{normalized.join(',')}}")
end