1

我正试图根据我的需要调整 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视图,如下所示:ProductsControllerproduct_type

<% if @product.option_types.product_type_key == :vehicle_bonnet %>
   ...
<% end %>

我明白了undefined method ``product_type_key'。由于SuperMap. 现在,ProductandOptionType有一些奇怪的关联(至少对我来说)。

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

不是最漂亮的方法,但它可以像我期望的那样工作......

4

0 回答 0