Rails中热切的负载多态关联(包括清晰的代码示例)

时间:2019-03-24 09:52:10

标签: ruby-on-rails ruby postgresql activerecord

我在Rails 5中具有以下db(Postgresql)结构:

class Book < ApplicationRecord
  belongs_to :location
end

class Song < ApplicationRecord
  belongs_to :location
end

class Location < ApplicationRecord
  # position INT
end

class Item < ApplicationRecord
  belongs_to :product, polymorphic: true # Book or Song
  has_one :location, through: :product
end

# Expected result
Item.includes(product: :location).order('locations.position ASC')
Item.first.location

# Actual result
# ActiveRecord::EagerLoadPolymorphicError (Cannot eagerly load the polymorphic association :product)

但是我很难通过多态的 Product 引用 Location 。可能是我在这里错过了一些选择并选择了错误的数据库结构吗?您能在这里建议一些“ Rails way”解决方法,而不是原始sql吗?

2 个答案:

答案 0 :(得分:1)

我不了解您的商品模型,但通常是这样设置多态的:

class Book < ApplicationRecord
  has_one :location, as: :locateable, class_name: Location
end

class Song < ApplicationRecord
  has_one :location, as: :locateable, class_name: Location
end

class Location < ApplicationRecord
  belongs_to :locateable, polymorphic: true
end

但请参阅documentation on polymorphic relation

答案 1 :(得分:1)

原因是您做错了。在您的代码中,您说的是产品将是多态的,但语法仍然错误,并且在其他模型中不包括该多态关联。.请检查以上答案并检查导轨进一步说明的官方指南。