如何根据多态belongs_to关联的属性进行ActiveRecord查询?
例如,我有一个名为Tagging
的模型,它具有名为tagged_item
的多态belongs_to关联。
不幸的是Tagging.joins(:tagged_item)
会抛出ActiveRecord::EagerLoadPolymorphicError
。所以我不能做Tagging.joins(:tagged_item).order("tagged_item.created_at DESC")
。
有什么建议吗?
答案 0 :(得分:0)
您无法直接使用多态关系进行连接,因为多态对象的数据位于不同的表中。您仍然可以尝试手动执行此操作,如以下示例所示。
class Tagging < ActiveRecord::Base
belongs_to :tagged_item, :polymorphic => true
end
class Post
has_many :image_tagging, :as => :tagged_item
end
class Comment
has_Many :image_tagging, :as => :tagged_item
Tagging.select("taggins.*, COALESCE(posts.created_at, comments.created_at) AS tagged_item_created_at").
joins("LEFT OUTER JOIN posts ON posts.id = tagging.tagged_item_id AND tagging.tagged_item_type = 'Post'").
joins("LEFT OUTER JOIN comments ON comments.id = tagging.tagged_item_id AND tagging.tagged_item_type = 'Comment'").
order("tagged_item_created_at DESC")
COALESCE选择提供的第一列,否则选择另一列。它与mysql中的IFNULL相同,或者你甚至可以使用CASE WHEN ... IS NULL THEN ... ELSE ... END