2011-07-09 15 views
8

tengo mis modelos de configuración de este modo:rieles belongs_to no programar una ID de clave externa con el nombre de la clase personalizada

class User < ActiveRecord::Base 
    has_many :posts, :foreign_key => 'author_id' 
end 

class Post < ActiveRecord::Base 
    belongs_to :author, :class_name => 'User' 
end 

Suponiendo:

p = Post.first # just any post instance 
a = User.first # any user instance 

Ahora bien, esta pieza de código está actuando muy raro

p.author = a 

Después de configurar el autor, el atributo author_id de la publicación debe establecerse en la identificación del usuario. Pero esto no está sucediendo.

Intenté usar modelos con belongs_to que no tienen el parámetro class_name y todo funciona como se esperaba.

Ahora, una cosa más que lo hace más raro es que cuando cambio la asociación a belongs_to :author, :class_name => 'User', :foreign_key => 'author_id', sorprendentemente funciona.

¿Esto es un error en Rails 3.0.9? El parámetro clave externa no debería ser innecesario porque, como dicen los documentos, su valor predeterminado es el nombre de la asociación a la que se agrega _id.

También tenga en cuenta que incluso sin :foreign_key => 'author_id', todo lo demás con respecto a la asociación funciona como se esperaba. (Como buscar el modelo asociado) Lo único que no funciona es el método setter que no establece la clave externa.

sé que solo podía hacer p.author_id = a.id o simplemente añadir :foreign_key params a todos mis asociaciones con class_name, pero yo prefiero el más elegante sintaxis de p.author = a

Respuesta

6

Después de leer un montón de código de rieles y rastreo esto es lo que encontré:

Este error existe debido a la gema composite_primary_keys que anuló los rieles predeterminados reflection.rb.

Tendré que comprobar cómo implementaron los métodos primary_key_name y derive_primary_key_name.

Ha pasado bastante tiempo desperdiciando este error tonto, pero al menos aprendí mucho sobre el funcionamiento interno de ActiveRecord.

Cuestiones relacionadas