私は自分のニーズに合わせてスプリーを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
観点からチェックしたいと思います。ProductsController
product_type
<% if @product.option_types.product_type_key == :vehicle_bonnet %>
...
<% end %>
そして私は得るundefined method ``product_type_key'
。このメソッドは、のおかげで利用できるはずですSuperMap
。さて、Product
とOptionType
には少し奇妙な関連があります(少なくとも私にとっては)。
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
最も美しい方法ではありませんが、期待どおりに機能します...