Упорядочить по полиморфному атрибуту own_to - PullRequest
4 голосов
/ 19 июня 2011

Как сделать запрос ActiveRecord, упорядочивающий по атрибуту полиморфной ассоциации принадлежат_ к *? 1001 *

Например, у меня есть модель с именем Tagging, имеющая полиморфную ассоциацию принадлежащего_ к имени с именем tagged_item.

К сожалению Tagging.joins(:tagged_item) бросает ActiveRecord::EagerLoadPolymorphicError.Поэтому я не могу сделать что-то вроде Tagging.joins(:tagged_item).order("tagged_item.created_at DESC").

Есть предложения?

1 Ответ

0 голосов
/ 19 октября 2012

Нельзя создать соединение напрямую с полиморфными отношениями, поскольку данные полиморфных объектов находятся в разных таблицах.Тем не менее, вы можете попытаться сделать это вручную, как в следующем примере.

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 выбирает первый предоставленный столбец, если существует, в противном случае - другой.Это то же самое, что IFNULL в mysql, или вы даже можете использовать CASE WHEN ... NULL THEN ... ELSE ... END

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...