分類モデルを介して関連付けられた多くの「分類法」を持つ User というモデルがあります。これらのタクソノミーの 1 つは、Topic と呼ばれるモデルです (Taxonomy から継承)。私のモデル User は、「分類可能」とも呼ばれます。
編集:問題を明確にするためにモデルを追加しました
class User < ActiveRecord::Base
has_many :classifications, :as => :classifiable, :foreign_key => :classifiable_id
has_many :topics, :through => :classifications, :source => :taxonomy, :source_type => "Topic"
end
class Taxonomy < ActiveRecord::Base
end
class Topic < Taxonomy
has_many :classifications, :as => :taxonomy, :foreign_key => :taxonomy_id, :source_type => "Topic"
has_many :professionals, :through => :classifications, :source => :classifiable, :source_type => "User", :conditions => {:is_a_professional => true}
has_many :questions, :through => :classifications, :source => :classifiable, :source_type => "Question"
has_many :guides, :through => :classifications, :source => :classifiable, :source_type => "Guide"
end
class Classification < ActiveRecord::Base
attr_accessible :classifiable, :classifiable_id, :classifiable_type,
:taxonomy, :taxonomy_id, :taxonomy_type
belongs_to :classifiable, :polymorphic => true
belongs_to :taxonomy, :polymorphic => true
end
関連付けを削除したい場合を除いて、すべてうまくいきます。
user = User.find(12) # any user
topic = user.topics.last # any of his topics
user.topics.delete(topic)
SQL ActiveRecord の実行は次のとおりです。
DELETE FROM "classifications" WHERE "classifications"."classifiable_id" = 12 AND "classifications"."classifiable_type" = 'User' AND "classifications"."taxonomy_id" = 34 AND "classifications"."taxonomy_type" = 'Taxonomy'
明らかに、taxonomy_type が間違っています。「Taxonomy」ではなく「Topic」である必要があります。
ポリモーフィック アソシエーションと STI を使用しているため、ActiveRecord を次のように構成する必要がありました。
ActiveRecord::Base.store_base_sti_class = false
ただし、collection.delete ではトリガーされないようです。これはレールのバグですか?