9

Sto costruendo un flusso di attività pubblica che contiene un flusso di quanto segue:Rails 3 eager loading di profonda associazione nidificato

  1. utente pubblicati 3 minuti fa
  2. utente ha recitato un post

Sto usando la gemma public_activity per raggiungere questo obiettivo.

La mia domanda è se esiste un modo di utilizzare lo includes per una funzione polimerica.

Il codice che sto facendo funzionare attualmente è la seguente:

#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 

Il tracciabile può essere un post o una stella. Ho funzioni di rendering per la visualizzazione di entrambi. Il problema è che, se provo a qualcosa di output come {user} {recitato postcontent}, lo fa in questo modo:

activity.trackable.post.content 

Quindi questo si traduce in più query, ogni volta che trova un post. Come posso affrontare questo problema/situazione?

Grazie in anticipo.

risposta

3

Non si è in grado di utilizzare la sintassi di caricamento standard eager?

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

Il tracciabile può contenere anche un altro tipo di classe polimorfica, che potrebbe non avere un: contenuto come attributo. – swaroopsm

Problemi correlati