5

Sto usando public_activity e uno dei miei parziali ho questa chiamata:Come faccio a caricare eager per più associazioni?

<%= link_to "#{activity.trackable.user.name} " + "commented on " + "#{activity.trackable.node.name}", node_path(activity.trackable.node.family_tree_id,activity.trackable.node) %> 

che viene eseguito da questa chiamata:

 <% @unread_act.each do |friend| %> 
     <li><%= render_activity friend %> </li> 
     <% end %> 

Quella variabile di istanza viene assegnato a mio ApplicationController qui:

Sto usando la gemma Bullet, per trovare le query N + 1 e il feedback che ottengo è questo:

N+1 Query detected 
    Comment => [:node] 
    Add to your finder: :include => [:node] 
N+1 Query method call stack 

inizialmente ho ottenuto quel messaggio per :trackable e per :user. Entrambe le cose ora sono caricate con impazienza tramite includes all'interno di questa dichiarazione di assegnazione.

Tuttavia, non ho idea di come andare su 3 livelli in profondità su un caricamento ansioso - piuttosto che solo due.

Dato che il nodo si chiama come activity.trackable.node.name, immagino un po 'appropriata assegnazione eager loading sarebbe simile:

@unread_act = Notification.where(owner_id: current_user).includes(:trackable => [:user, :node]).unread_by(current_user) 

Ma l'errore che ottengo è questo:

ActiveRecord::AssociationNotFoundError at/
Association named 'node' was not found on Node; perhaps you misspelled it? 

ho neanche preso che quando faccio semplicemente:

@unread_act = Notification.where(owner_id: current_user).includes(:trackable => :node).unread_by(current_user) 

Così ho il sospetto che qualcosa els e sta andando male qui.

Qualche idea?

Modifica 1

vedere Nodo modelli & di notifica e le associazioni di sotto.

Node.rb

class Node < ActiveRecord::Base 
    include PublicActivity::Model 
    tracked except: :update, owner: ->(controller, model) { controller && controller.current_user } 

    belongs_to :family_tree 
    belongs_to :user 
    belongs_to :media, polymorphic: true, dependent: :destroy 
    has_many :comments, dependent: :destroy 
    has_many :node_comments, dependent: :destroy 

Notification.rb

class Notification < PublicActivity::Activity 
    acts_as_readable :on => :created_at 
end 
+0

Mostra i modelli. Quali sono le associazioni 'trackable' di Notification'? Quali sono le associazioni di 'Node'? –

+0

@MarekLipka Domanda aggiornata. – marcamillion

risposta

0

Sembra il modo corretto per affrontare questo è quello di utilizzare un array sull'attributo trackable modo:

@unread_act = Notification.where(recipient_id: current_user).includes(:trackable => [:user, :node]).unread_by(current_user).order("created_at desc") 

La parte principale è:

includes(:trackable => [:user, :node])

Questo sembra aver funzionato magnificamente.