2010-01-17 7 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 

Intentando hacer un resumen de las transacciones donde la cuenta está activa.ActiveRecord :: EagerLoadPolymorphicError: no se puede cargar con entusiasmo la asociación polimórfica

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

Así que después de leer un poco me encontré con esto: La razón es que el tipo del modelo de los padres es un valor de columna por lo que su nombre de la tabla correspondiente no se puede poner en el FROM/JOIN cláusulas de esa consulta. El nombre de la tabla es bankaccounts y tarjetas de crédito, ¿eso significa que deben ser singulares? También el tipo de cuenta es una cadena ya sea Bankaccount o Tarjeta de crédito para reflejar el modelo, pero ¿debería ser el nombre de la tabla?

Respuesta

18

Hay dos cuestiones aquí:

  1. sumando sobre una asociación polimórfica.
  2. Condición sobre una asociación polimórfica.

No puede hacer ninguna de estas cosas. Lo que debería obtener el mismo error mediante la realización de estas dos consultas:

  1. Transactions.count (: todos, Une =>: cuenta)
  2. Transactions.find (: todos,: Condiciones => "cuentas. estado = 'activa'",: une =>: cuenta)

Para conseguir realmente la información que necesita debe enumerar explícitamente las asociaciones polimórficas posibles padres. Una forma de hacerlo es simplemente usar SQL e IZQUIERDA, para que pueda usar una sola consulta. El uso de rieles Esto se puede realizar con dos consultas:

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: Lo mejor es usar es: en lugar de unirse a: incluir si usted no planea sobre el acceso a los objetos unidas después de la consulta.

+0

Gracias por responder mi pregunta y, finalmente, siguió esa misma ruta. Gracias de nuevo Pan: D – bordicon

+0

Spot on. Consulte también esta respuesta para unir modelos polimórficos: http://stackoverflow.com/a/22995162/293280 –

0

Adicional a la respuesta de pan, incluso podría hacer una unión en lugar de agregarlas. que ejecuta solo una consulta

Cuestiones relacionadas