1

私は自分のニーズに合わせてスプリーをtweekしようとしていますが、私はぶつかりました。あまり多くのコードを貼り付けずに、できる限り説明しようと思います。'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。さて、ProductOptionTypeには少し奇妙な関連があります(少なくとも私にとっては)。

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かなり長いモデルの真ん中のどこかにあるので、モデルに(imho)間違った場所にあるエイリアスがあったことが判明しました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