2015-06-02 13 views
8

Dato un sistema che consente agli utenti di invitare altri utenti a eventi:Desideroso di caricamento una consuetudine unirsi con un'istanza variabile

class Event 
    has_many :invites 
end 

class User 
    has_many :invites 
    has_many :invited, inverse_of: :inviter, foreign_key: :inviter_id, class_name: 'Invite' 
end 

class Invite 
    belongs_to :user 
    belongs_to :event 
    belongs_to :inviter, class_name: 'User' 
    has_many :invited, -> (invite) { where(invites: { event_id: invite.event_id }) }, through: :user, class_name: 'Invite' 
end 

che sto generando un semplice rapporto che mostra tutti gli inviti per un evento. Sto cercando di modificare il report per includere anche alcune azioni che possono essere fatte contro il invited per l'evento del campione:

<%- event.includes(:user).each do |invite| -%> 
    <%= invite.user.name %> 
    <%- invite.invited.each do |other| -%> 
    <%= link_to invite_path(other), method: :destroy do %> 
     ... 
    <% end %> 
    <%- end -%> 
<%- end -%> 

Questo funziona bene, ma ha un problema N + 1. Tentativo di caricare con impazienza l'associazione personalizzata fornisce:

AVVISO DEPRESSIONE: l'ambito di associazione 'invitato' è dipendente dall'istanza (il blocco di ambito accetta un argomento). Il precaricamento avviene prima che vengano create le singole istanze. Ciò significa che non è passata alcuna istanza allo scope di associazione. Ciò probabilmente causerà un comportamento errato o errato. L'adesione, il caricamento precaricato e avido di queste associazioni è deprecato e verrà rimosso in futuro.

C'è un modo per fare carico di lavoro come questo? È possibile dare altri suggerimenti allo has_many invece di utilizzare una variabile di istanza?

+0

Sto cercando di capire cosa stai cercando di recuperare. Invita dallo stesso utente allo stesso evento? –

+0

@ D-Side Sì, cercando di ottenere altri inviti per ogni utente invitato. L'esempio attuale è molto più complesso ma ho cercato di semplificare il più possibile questa domanda. –

+1

Bene, stai recuperando una raccolta di inviti per invito. Questo sarà un dolore, dal momento che richiede un self join, che a sua volta richiede aliasing una delle istanze di tabella coinvolte. Quindi, l'uso di Arel sembra essere un must. –

risposta

Problemi correlati