2010-01-17 3 views
9
class Transaction < ActiveRecord::Base 
    belongs_to :account, :polymorphic => true 
end 

class Bankaccount < ActiveRecord::Base 
    has_many :transactions, :as => :account 
end 

class Creditcard < ActiveRecord::Base 
    has_many :transactions, :as => :account 
end 

Tentativo di eseguire una sommatoria delle transazioni in cui è attivo l'account.ActiveRecord :: EagerLoadPolymorphicError: impossibile caricare l'associazione polimorfica

Transaction.sum(:all, :conditions => "account.status = 'active'", :include => :account) 

Così, dopo qualche lettura mi sono imbattuto in questo: La ragione è che il tipo di modello di genitore è un valore di colonna per cui il suo corrispondente nome della tabella non può essere messo in FROM/JOIN clausole di quella query. Il nome della tabella è conti bancari e carte di credito quindi vuol dire che dovrebbero essere singolari? Anche l'account_type è una stringa o Bankaccount o Creditcard per riflettere il modello, ma dovrebbe invece essere il tablename?

risposta

18

ci sono due problemi qui:

  1. sommando su un'associazione polimorfica.
  2. Condizione su associazione polimorfica.

Non si può effettivamente fare nessuna di queste cose. Così si dovrebbe ottenere lo stesso errore l'esecuzione di queste due domande:

  1. Transactions.count (: all,: unisce =>: conto)
  2. Transactions.find (: all,: condizioni => "conti. status = 'active' ",: joins =>: account)

Per ottenere effettivamente le informazioni necessarie è necessario elencare esplicitamente le possibili associazioni polimorfiche parentali. Un modo per farlo è semplicemente usare SQL e LEFT JOINS, in modo che tu possa usare una singola query. Utilizzando questo Rails può essere effettuata con due query:

Creditcard.sum(
    :all, 
    :select => "transactions.amount", 
    :conditions => "creditcards.status = 'active'", 
    :joins => :transaction 
) + Bankaccount.sum(
    :all, 
    :select => "transactions.amount", 
    :conditions => "bankaccounts.status = 'active'", 
    :joins => :transaction 
) 

P.S: E 'meglio usare: unirsi al posto di: comprendere se non si ha intenzione di accedere agli oggetti uniti dopo che la query.

+0

Grazie per aver risposto alla mia domanda e alla fine è andato lo stesso percorso. Grazie ancora Pan: D – bordicon

+0

Spot on. Guarda anche questa risposta per aderire ai modelli polimorfici: http://stackoverflow.com/a/22995162/293280 –

0

In aggiunta alla risposta di pan, si potrebbe anche fare un sindacato invece di aggiungerli. che esegue solo una query