Forum: Rails-ES Relacion ternaria

1ee88aee8e3e0f0ef222dd324787ae4e?d=identicon&s=25 Martín Peña (martinpena)
on 2010-04-30 16:36
Relativamente nuevo en Rails !!!

Como modelarían estas relaciones???

Estoy teniendo problemas para modelar una relación ternaria, la idea es
que en una película un Nombre puede estar en mas de un Rol, como actor y
director por ejemplo, a su vez las relaciones son todas del tipo N-a-N,
el tema es que cada vez que creo una película se crean varias copias de
un registro en la tabla apariciones

Esto es un ejemplo del estado de la tabla luego de crear una película
con dos Nombres

id  pelicula_id  nombre_id  rol_id
----------------------------------------------
21  null    10    2
22  null    10    2
23  6    10    null
24  null    11    3
25  null    11    3
26  6    11    null
27  6    10    null
28  6    11    null

Y estos son los modelos

class Pelicula < ActiveRecord::Base
  has_many :apariciones, :dependent => :destroy
  has_many :nombres, :through => :apariciones
  has_many :roles, :through => :apariciones

  accepts_nested_attributes_for :nombres, :reject_if => lambda { |a|
a[:nombre].blank? }, :allow_destroy => true
  accepts_nested_attributes_for :roles, :reject_if => lambda { |a|
a[:nombre].blank? }, :allow_destroy => true
end

class Nombre < ActiveRecord::Base
  has_many :apariciones, :dependent => :delete_all
  has_many :peliculas, :through => :apariciones
  has_many :roles, :through => :apariciones

  accepts_nested_attributes_for :roles, :reject_if => lambda { |a|
a[:nombre].blank? }, :allow_destroy => true
end

class Rol < ActiveRecord::Base
  has_many :apariciones, :dependent => :delete_all
  has_many :peliculas, :through => :apariciones
  has_many :nombres, :through => :apariciones
end

Muchas gracias
Martín
1ee88aee8e3e0f0ef222dd324787ae4e?d=identicon&s=25 Martín Peña (martinpena)
on 2010-05-03 20:57
La causa es un bug en la version 2.3.5 de rails con el uso de
accepts_nested_attributes_for

https://rails.lighthouseapp.com/projects/8994/tick...
This topic is locked and can not be replied to.