我正试图根据我的需要调整 Spree,但我遇到了一个障碍。我会尽量解释清楚而不粘贴太多代码,因为 Spree 有很多...
对于初学者。我已经OptionType
这样扩展了
Spree::OptionType.class_eval do
PRODUCT_TYPES = SuperMap.new( [:default, 0],
[:vehicle_bonnet, 1],
[:vehicle_images, 2])
super_mapped_attr :product_type, PRODUCT_TYPES
attr_accessible :product_type
end
我想查看我正在处理的类型的show
视图,如下所示:ProductsController
product_type
<% if @product.option_types.product_type_key == :vehicle_bonnet %>
...
<% end %>
我明白了undefined method ``product_type_key'
。由于SuperMap
. 现在,Product
andOptionType
有一些奇怪的关联(至少对我来说)。
module Spree
class Product < ActiveRecord::Base
has_many :product_option_types, :dependent => :destroy
has_many :option_types, :through => :product_option_types
end
end
到目前为止似乎还可以。
module Spree
class ProductOptionType < ActiveRecord::Base
belongs_to :product
belongs_to :option_type
acts_as_list :scope => :product
end
end
现在是奇怪的部分:
module Spree
class OptionType < ActiveRecord::Base
has_many :option_values, :order => :position, :dependent => :destroy
has_many :product_option_types, :dependent => :destroy
has_and_belongs_to_many :prototypes, :join_table => 'spree_option_types_prototypes'
attr_accessible :name, :presentation, :option_values_attributes
validates :name, :presentation, :presence => true
default_scope :order => "#{self.table_name}.position"
accepts_nested_attributes_for :option_values, :reject_if => lambda { |ov| ov[:name].blank? || ov[:presentation].blank? }, :allow_destroy => true
end
end
这实际上是整个OptionType
模型。令我惊讶的是它没有has_many :products, through: :product_option_types
。我试图将此行添加到我的扩展程序中,但没有帮助。我当然尝试过其他一些事情,但它让我回到这个版本变得如此混乱,因为我认为它最好地展示了我想要实现的目标。我错过了什么?
编辑(已解决,我希望如此......):
原来在Product
模型中有一个别名alias :options :product_option_types
,它(恕我直言)在错误的地方,因为在一个相当长的模型中间的某个地方(我应该认为它应该更接近has_many
,但这只是我) .
更何况,options
竟然是一个阵法,没想到这么震惊。所以,我所做的是扩展产品模型,添加了一个方法,我正在检查product_type_key
,如下所示:
def type_of_product?(type)
options.each do |opts|
if opts.option_type.product_type_key == type
return true
end
end
false
end
不是最漂亮的方法,但它可以像我期望的那样工作......