Как оптимизировать полиморфную новостную ленту в рельсах? - PullRequest
3 голосов
/ 27 декабря 2011

Вот моя модель:

class User < ActiveRecord::Base
  has_many :activities
  has_many :requests

class Activity < ActiveRecord::Base
  belongs_to :user
  belongs_to :object, :polymorphic => true

Я хочу получить все действия пользователей и отобразить их

Activity.where(:user_id => current_user.id).include(:object)

проблема в том, что я не могу загружать объектную модельпотому что это полиморфно Как мне преодолеть эту проблему?

Ответы [ 3 ]

6 голосов
/ 07 января 2012

Стремительная загрузка поддерживается с полиморфными ассоциациями. Вам нужно будет сделать что-то вроде следующего:

Activity.find(:all, :include => :objectable, :conditions => {:user_id => current_user.id})

Хотя вам необходимо убедиться, что вы правильно определили полиморфные отношения в связанных моделях.

Для получения дополнительной помощи обратитесь к: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#label-Eager+loading+of+associations

Полиморфная часть находится в конце раздела «Стремительная загрузка ассоциаций».

2 голосов
/ 08 января 2012

Как говорит @Wahaj, готовая загрузка работает только с :includes, а не :join.

Вот объяснение из документов:

Address.find (: все,: include =>: addressable)

Это выполнит один запрос для загрузки адресов и загрузки адресуемых адресов по одному запросу для каждого адресуемого типа.Например, если все адресуемые адреса относятся к классу Person или Company, то будет выполнено всего 3 запроса.Список адресуемых типов для загрузки определяется на обратной стороне загруженных адресов.Это не поддерживается, если Active Record должен вернуться к предыдущей реализации активной загрузки и вызовет ActiveRecord :: EagerLoadPolymorphicError.Причина в том, что тип родительской модели является значением столбца, поэтому его соответствующее имя таблицы не может быть помещено в предложения FROM / JOIN этого запроса.

Я думаю, что вы ищете:

current_user.activities.includes(:object)

Как говорят в документах, для каждой ассоциации будет дополнительный запрос.Я не уверен, но вам может потребоваться определить связь, другое направление для рельсов, чтобы знать, какие модели AR искать, например:

class Post < ActiveRecord::Base
  has_many :activities, :as => :object
end

Если вы все еще получаете ошибку, вы можетев более ранней версии rails, которая еще не реализовала это.

0 голосов
/ 06 января 2012

Невозможно загружать в полиморфные отношения ... но вы можете сделать это для одного полиморфного типа, например, если у вас два polymorphic_type, тогда отфильтруйте записи по этому типу, а затем загрузите его, тогда он будет работать .. не идеальная готовая загрузка, а частичная готовая загрузка

...