按多态belongs_to属性排序

时间:2011-06-18 21:41:19

标签: ruby-on-rails-3 activerecord

如何根据多态belongs_to关联的属性进行ActiveRecord查询?

例如,我有一个名为Tagging的模型,它具有名为tagged_item的多态belongs_to关联。

不幸的是Tagging.joins(:tagged_item)会抛出ActiveRecord::EagerLoadPolymorphicError。所以我不能做Tagging.joins(:tagged_item).order("tagged_item.created_at DESC")

之类的事情

有什么建议吗?

1 个答案:

答案 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