Pregunta

Estoy trabajando con modelos análogos a los siguientes:

class Owner < ActiveRecord::Base
  has_many :owned
end

class Owned < ActiveRecord::Base
  belongs_to :owner
end

Puede presumir que owned_id y OWNER_ID está en los lugares correctos. El problema es que, en un controlador para una cadena mvc diferente en la aplicación,

@owner = Owned.find_by_id(owned_id, :include => :owner)

no funciona. Me da la OWNER_ID, columna, de forma natural, pero no puede hacerlo a continuación

@owned.owner # is just nil

¿Qué ocurre? Es decir, que podía hacer la asignación directa antes de pasar el resultado a la vista:

@owned.owner = Owner.find_by_id(@owned.owner_id)

, pero que sólo parece tonto. Vamos, avergonzarme. ¿Qué es lo obvio que me he perdido? Esto funciona en otros lugares en mi aplicación, pero no puedo encontrar las diferencias. ¿Hay algunas trampas comunes? Cualquier cosa ayuda.

Gracias

¿Fue útil?

Solución

No dejo de ganar. El objeto que corresponde 'propietario' había sido borrado de la tabla propietarios.

Lo curioso es, antes de crear una cuenta, que tenía un montón de karma en mi identidad basada en cookies. Entonces mis galletas se corrompieron, y no puedo pedir nada más que preguntas tontas ya, y mi karma se sienta en 1. Oh, bueno.

Otros consejos

reputación en StackOverflow no se basa cookie. Es posible que tenga que conectarse de nuevo o algo así.

Su pregunta parece dar a entender que tiene un campo en la tabla owned_id propietario. No es necesario que y debe eliminarlo.

Sólo se necesita un campo entero OWNER_ID en la tabla de propiedad.

Puede acceder a sus registros y las relaciones en un número de maneras. En primer lugar vamos a empezar por el acceso al registro propietario primero.

owner = Owner.find(owner_id)
owned = owner.owned # this is an array since you a 'has_many' relationship

Lo normal sería desea acceder a los registros de propiedad de la siguiente manera:

for owned in owner.owned
 puts owned.name # or access any other attributes
end

Si desea acceder a los registros de propiedad primero que podría hacer lo siguiente:

@owned = Owned.find(:all, :conditions => [ "owner_id = ?", owner_id ])
# @owned is an array so you need to iterate through it
for owned in @owned
  puts owned.owner.name # or access any other attribute from the owner
end

Una vez que tenga estas consultas de trabajo lo permite se puede preocuparse por la carga ansiosa añadiendo: incluir en sus estados de encontrar. Tenga en cuenta que esto puede ser de interés para la optimización pero no es necesario desde el principio.

Espero que esto ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top