【发布时间】:2011-05-03 21:52:50
【问题描述】:
有谁知道是否可以向产品的一组关键属性(名称、描述、永久链接、元描述等)添加新属性?我的想法是,我希望在创建产品时使用这些属性,而不是之后通过产品属性添加它们。
谢谢。
【问题讨论】:
标签: spree
有谁知道是否可以向产品的一组关键属性(名称、描述、永久链接、元描述等)添加新属性?我的想法是,我希望在创建产品时使用这些属性,而不是之后通过产品属性添加它们。
谢谢。
【问题讨论】:
标签: spree
最简单的方法是通过迁移将属性直接添加到产品模型。可以通过使用装饰器添加验证,这是 Spree 中用于覆盖模型的首选模式。
# in app/models/product_decorator.rb
Product.class_eval do
validates :some_field, :presence => true
end
另一种选择是为您的扩展字段创建辅助模型。也许是 ProductExtension
# in app/models/product_extension.rb
class ProductExtension < ActiveRecord::Base
belongs_to :product
validates :some_field, :presence => true
end
# in app/models/product_decorator.rb
Product.class_eval do
has_one :product_extension
accepts_nested_attributes_for :product_extension
delegate :some_field, :to => :product_extension
end
然后在您的产品创建表单中,您可以为这些字段提供 fields_for。我认为需要注意的一个问题是,在扩展可用之前,您需要创建已创建的 Product 模型。您可能可以通过产品控制器创建操作中的一些额外逻辑来解决此问题。
【讨论】:
我为 Spree 扩展 Product 模型的方式(通过 delegate_belongs_to):
#app/models/product_decorator.rb
Spree::Product.class_eval do
has_one :product_extension
accepts_nested_attributes_for :product_extension, :allow_destroy => true
delegate_belongs_to :product_extension, :some_field
attr_accessible :some_field
end
#app/models/product_extension.rb
class ProductExtension < ActiveRecord::Base
belongs_to :product, :class_name => 'Spree::Product'
attr_accessible :some_field
end
【讨论】: