2012-01-24 15 views
16

que tienen la siguiente configuración de las relaciones:HABTM relaciones con ActiveRecord

class Article < ActiveRecord::Base 
    has_and_belongs_to_many :authors 
end 

class Author < ActiveRecord::Base 
    has_and_belongs_to_many :articles 
end 

me di cuenta de que, aunque la tabla de unión articles_authors tiene marcas de tiempo, no poblar la hora de crear una nueva relación. Por ejemplo:

Author.first.articles << Article.first 

Es importante que realice un seguimiento de cuándo un autor está asociado a un artículo. ¿Hay alguna manera de que pueda hacer esto?

Respuesta

14

Desde el rails guides.

La regla más simple de oro es que se debe establecer un has_many: a través de la relación si es necesario trabajar con el modelo de relación como una entidad independiente. Si no necesita hacer nada con el modelo de relación, puede ser más sencillo configurar una relación has_and_belongs_to_many (aunque deberá recordar crear la tabla de unión en la base de datos).

Debe usar has_many: through si necesita validaciones, devoluciones de llamada o atributos adicionales en el modelo de unión.

class Article < ActiveRecord::Base 
    has_many :article_authors 
    has_many :authors, :through => :article_authors 
end 

class Author < ActiveRecord::Base 
    has_many :article_authors 
    has_many :articles, :through => :article_authors 
end 

class ArticleAuthor < ActiveRecord::Base 
    belongs_to :article 
    belongs_to :author 
end 

Si aún así no funciona con esa estructura, a continuación, en lugar de utilizar un empuje matriz, utilice un crear.

Author.first.article_authors.create(:article => Article.first) 
+3

¡Gracias! Crear un modelo de relación separado funciona. No pensé que el almacenamiento de marcas de tiempo fuera suficiente para garantizar un modelo por separado. – deadkarma

+1

¿Esto significa que la tabla articles_authors necesita ser renombrada a article_authors? –

+0

@TonyZito Eso es correcto. – Gazler

Cuestiones relacionadas