2012-03-23 8 views
18

Wow He estado luchando con esto durante todo el día, siguiendo el documento "oficial" de ruby ​​on rails guides, y descubrí que el documento podría haberme equivocado desde el principio. Solo quiero confirmar si esto es cierto.¿Ruby on Rails guía el documento en la asociación de Activerecord incorrecto?

Si va a http://guides.rubyonrails.org/association_basics.html y debajo de 2.10. sí se une a la sección que dice:

class Employee < ActiveRecord::Base 
    has_many :subordinates, :class_name => "Employee" 
    belongs_to :manager, :class_name => "Employee", 
    :foreign_key => "manager_id" 
end 

Ahora, soy un novato y apenas creía en el código (¿Qué más puedo hacer?) y escribió un código que es una variación de este mismo caso se unen. Sin embargo, cuanto más lo miraba, más no me sentía bien. ¿No se supone que :subordinates tiene el campo :foreign_key en lugar de :manager? De todos modos lo acabo de cambiar para que el código sea algo así como:

class Employee < ActiveRecord::Base 
    has_many :subordinates, :class_name => "Employee", :foreign_key => "manager_id" 
    belongs_to :manager, :class_name => "Employee" 
end 

y ahora está funcionando. ¿Me estoy perdiendo de algo? ¿O es el documento oficial incorrecto? Es difícil creer que el documento oficial presente información incorrecta, pero tal vez sea así.

+2

Sí, tienes razón. Una asociación llamada 'manager' asumiría por supuesto correctamente la clave externa' manager_id'. Y entonces la asociación 'subordinados' asumiría de la misma manera la inválida foreign_key' subordinate_id', por lo que es la que necesita cambiar. – DanneManne

+6

Envío commit para docrails, que corrige este error – MikDiet

+0

Veo cómo se colocó correctamente el: foreign_key => 'manager_id'. Hasta donde yo sé, foreign_key va con el lado belongs_to de la relación. Me gustaría ver un ejemplo de lo que llamas "... y ahora está funcionando". Por supuesto que podría estar perdiendo algo. – Daniel

Respuesta

1

Correcto, the guide document es incorrecto al momento de escribir esto.

El belongs_to no necesita la opción :foreign_key porque AR inferirá manager_id del nombre de la asociación ("gerente"). Según lo documentado, AR generaría un error cuando, dado un empleado @dwight, intente con @dwight.subordinates, porque AR usaría employee_id en la condición WHERE de la instrucción SELECT.

Según la AR documentation pasando la opción :foreign_key a has_many resultados en declarar el FK que se utilizará cuando se genera la consulta para @dwight.subordinates.

Cuestiones relacionadas