9

Я строю поток общественной активности, который содержит поток следующее:Rails 3 жадная загрузка глубокой вложенной ассоциации

  1. Пользователь отправил 3 минуты назад
  2. Пользователь избранные пост

Для достижения этой цели я использую жемчужину public_activity.

Мой вопрос заключается в том, есть ли способ использовать includes для полиморфной функции.

Код, который я бегу в настоящее время выглядит следующим образом:

#app/models/post.rb 

class Post < ActiveRecord::Base 

    include PublicActivity::Common 

    attr_accessible :content, :visibility 

    validates_presence_of :content 

    belongs_to :postable, :polymorphic => true 
    has_many  :stars 

end 

#app/models/star.rb 
class Star < ActiveRecord::Base 

    include PublicActivity::Common 

    validate :duplicate_star 

     belongs_to :user 
    belongs_to :post 

private 
    def duplicate_star 
errors.add(:base, "Post already starred") if Star.exists?(:user_id => self.user, :post_id => self.post) 
    end 

end 


#app/controllers/users_controller.rb 
class UsersController < ApplicationController 
    def index 
    @post = Post.new 
    @activities = PublicActivity::Activity.order("id desc").all.includes(:trackable, :owner) 
    end 
end 

отслеживаются может быть пост или звездой. У меня есть функции для отображения обоих. Проблема заключается в том, если я пытаюсь выводить что-то вроде {пользователь} {снялся PostContent}, он делает это так:

activity.trackable.post.content 

Так что это приводит к несколько запросов, каждый раз, когда он находит пост. Как решить эту проблему/ситуацию?

Заранее спасибо.

ответ

3

Вы не можете использовать стандартный синтаксис загрузки?

@activities = PublicActivity::Activity.order("id desc").includes(:owner, :trackable => {:post => :content}) 
+0

Отслеживаемый может также содержать другой тип типа полиморфного типа, у которого может не быть: содержание как атрибут. – swaroopsm

Смежные вопросы