rails 上的 Postgresql JSONB 嵌套形式 ruby

Postgresql JSONB nested form ruby on rails

我有产品作为活动记录 table 和 option_type 作为活动模型模型。选项类型是一个对象数组,如下所示,

[
  {name: 'color', values: ['red', 'blue']},
  {name: 'size', values: ['small', 'medium']}
]


class OptionType
  include ActiveModel::Model

  attr_accessor :name, :values, :default_value

  def initialize(**attrs)
    attrs.each do |attr, value|
      send("#{attr}=", value)
    end
  end

  def attributes
    [:name, :values, :default_value].inject({}) do |hash, attr|
      hash[attr] = send(attr)
      hash
    end
  end

  class ArraySerializer
    class << self
      def load(arr)
        arr.map do |item|
          OptionType.new(item)
        end
      end

      def dump(arr)
        arr.map(&:attributes)
      end
    end
  end
end

我想为 option_type 设计一个具有嵌套形式的 form_for,以便用户可以添加各种选项名称及其值。怎么做?

参考链接如下,

我知道这不是您希望得到的答案,但与其将所有内容都扔进 JSONB 列并希望获得最佳结果,不如尽可能在一个关系方式:

class Product < ApplicationRecord
  has_many :options
  has_many :product_options, through: :options
end

# rails g model option name:string product:belongs_to
class Option < ApplicationRecord
  belongs_to :product
  has_many :product_options
end

# rails g model product_option option:belongs_to name:string ean:string
class ProductOption < ApplicationRecord
   belongs_to :option 
   has_one :product, through: :options
end

如果您的数据实际上足够结构化,您可以编写引用其属性的代码,那么 JSON 列不是正确的答案。 JSON/arrays 也不是设置关联的正确答案。

这使您可以使用外键来维护引用完整性,并具有稍微合理的架构和查询,而不是仅仅处理完全无结构的混乱。如果您随后必须处理可以具有不同类型的属性,例如可以是字符串、布尔值或数字的选项,您可以使用 JSON 列来存储值,以在一定程度上减轻旧 EAV 的缺点模式。

然后可以通过单独的表单、嵌套属性或 AJAX 根据您的要求创建产品的变体。