我的问题是如下.我如何加入belongs_to多态模型的关联
有情况
opinion.rb
class Opinion < ActiveRecord::Base belongs_to :opinionable,:polymorphic => true belongs_to :category end
answer.rb
class Answer < ActiveRecord::Base has_many :opinions,:as => :opinionable end
我该怎么做跟随
Opinion.joins(:opinionabe).all
它会抛出
ArgumentError: You can’t create a polymorphic belongs_to join without specifying the polymorphic class!
我如何具体要加入哪个班级?
第二个问题如何预加载?
Opinion.preload(:opinionable).all
工作正常.它将对belongs_to中的每个类进行查询.
但.如果我想做一些类似的事情
Opinion.preload(:opinionable => :answer_form).all
有问题,因为一个模型有这个关联,第二个没有.所以它会抛出异常.
那么我可以做些什么呢
Opinion.preload(:answer => :answer_form,:another_belongs_to_model).all
?
谢谢大卫!
解决方法
您的Opinion模型看起来好像没有为您指定explicitable_type:string列.
尝试以这种方式更新您的迁移:
class CreateOpinions < ActiveRecord::Migration def self.up create_table :opinions do |t| t.integer :opinionable_id t.string :opinionable_type # ... other fields t.timestamps end end def self.down drop_table :opinions end end
这将解决您的第二个问题和Opinion.preload(:舆论).
你不能加入多态关联,因为它们可以位于不同的表中,在加载了意见模型之后被检测到.那为什么模型需要列commentable_type.
如果您尝试这样做,您会得到下一个例外
ActiveRecord::EagerLoadPolymorphicError
: Can not eagerly load the polymorphic association:opinionable
UPD:添加魔法加入^ _ ^
class Opinion < ActiveRecord::Base belongs_to :opinionable,:polymorphic => true belongs_to :opinionable_answer,:foreign_key => :opinionable_id,:class_name => "Answer" scope :by_type,lambda { |type| joins("JOIN #{type.table_name} ON #{type.table_name}.id = #{Opinion.table_name}.opinionable_id AND #{Opinion.table_name}.opinionable_type = '#{type.to_s}'") } end
例:
Opinion.by_type(Answer).to_sql => "SELECT \"opinions\".* FROM \"opinions\" JOIN answers ON answers.id = opinions.opinionable_id AND opinions.opinionable_type = 'Answer'"