9

Sto utilizzando Ruby 2.2.1 e Rails 4.2 per creare un'app. In uno dei miei punti di vista, ho ricevuto il seguente messaggio:il metodo non definito `include 'per l'istanza dell'oggetto

N+1 Query detected Politician => [:account] Add to your finder: :includes => [:account]

N+1 Query method call stack

app/models/user.rb:19:in `account'

app/controllers/home_controller.rb:6:in `index'

Qui è la mia azione a controller di casa:

@account = current_user.account 
@new_contacts = current_user.contacts.created_this_week.count 
@new_collabs = current_user.collaborators.created_this_week.count 

E la sezione del modello utente:

belongs_to :role, polymorphic: true, dependent: :destroy 
delegate :account, to: :role 
delegate :collaborators, to: :role 
delegate :contacts, to: :role 

I già provato a quanto segue:

@account = current_user.account.includes(:contacts, :collaborators) 

Ma ho solo l'errore:

undefined method `includes' for <Account:0x007fa7474e04a8> 

ho fatto qualche ricerca e ciò che sembra è che comprende opere solo per i rapporti (che non è il caso).

Il proiettile è preoccupante per niente? Cosa posso fare per smettere di essere una query N + 1?

Grazie!

+0

cosa c'è nella riga n. 19? spettacolo plz linea –

+0

@R_O_R 19 è delegato ': conto, a:: role' linea 6 della home_controller è: ' @account = current_user.account' –

risposta

4

includes può essere chiamato solo su ActiveRecord::Relation s o ActiveRecord::Base classi per bambini, account sembra essere un instace di un modello, quindi non rispondere alle ActiveRecord::Relation metodi come includes. Sembra un falso positivo da bullet non appena ricevi l'account solo da current_user, sebbene non raccomandi le delocalizzazioni alle associazioni, può portare a problemi N + 1 nella funzione.


Sostituzione delagate con l'associazione AR:

Supponendo che Account è un modello regolare ActiveRecord è possibile utilizzare has_one macro (simile a documentation per maggiori dettagli):

has_one :account, through: :role 

E 'molto manciata quando è necessario iterare attraverso gli utenti:

# You can avoid `N + 1` 
User.includes(:account).limit(50).each { |u| puts u.name } 
+0

Allora, cosa a te consigliare di evitare le delegazioni in questo caso ? –

+0

Supponendo che 'Account' sia un normale modello' ActiveRecord' puoi usare la macro 'has_one' (vedi [documentazione] (http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i -has_one) per maggiori dettagli): 'has_one: account, attraverso:: role' –

+0

ruolo è in realtà un'associazione polimorfica, quindi quando faccio ' has_one: account, tramite:: role' ottengo il seguente errore: 'Can not have a has_one: attraverso l'associazione 'User # account' che passa attraverso l'associazione polimorfica 'Ruolo utente #'. Forse dovrei restare con un delegato? –