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 根据您的要求创建产品的变体。
我有产品作为活动记录 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 根据您的要求创建产品的变体。