Sto costruendo un flusso di attività pubblica che contiene un flusso di quanto segue:Rails 3 eager loading di profonda associazione nidificato
- utente pubblicati 3 minuti fa
- 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.
Il tracciabile può contenere anche un altro tipo di classe polimorfica, che potrebbe non avere un: contenuto come attributo. – swaroopsm