ruby-on-rails – Rails从多态模型加入或预加载belongs_to关联

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – Rails从多态模型加入或预加载belongs_to关联前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的问题是如下.我如何加入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'"
原文链接:https://www.f2er.com/ruby/272153.html

猜你在找的Ruby相关文章