Dado el siguiente modelo de base de datos, cómo y dónde definiría las relaciones entre los modelos de eliminación? Descubrí la configuración básica de la asociación de tablas, pero cuando quiero agregar dependencias para habilitar la eliminación de los objetos anidados me pierdo.Cómo definir allow_destroy y: dependent =>: destroy en Rails?
Aquí es el modelo de relación que he creado.
class User < ActiveRecord::Base
has_many :studies
end
class Study < ActiveRecord::Base
has_many :internships
belongs_to :student, :class_name => "User", :foreign_key => "user_id"
belongs_to :subject
belongs_to :university, :class_name => "Facility", :foreign_key => "facility_id"
accepts_nested_attributes_for :subject, :university, :locations
end
class Subject < ActiveRecord::Base
has_many :studies
end
class Internship < ActiveRecord::Base
belongs_to :study
belongs_to :company, :class_name => "Facility", :foreign_key => 'facility_id'
accepts_nested_attributes_for :company, :study
end
class Facility < ActiveRecord::Base
has_many :internships
has_many :locations
has_many :studies
accepts_nested_attributes_for :locations
end
class Location < ActiveRecord::Base
belongs_to :facility
end
¿Dónde pondrías :dependent => :destroy
y :allow_destroy => true
para habilitar las siguientes escenarios? No quiero confundirte. Por lo tanto, dejo afuera mis intentos.
Escenario de prácticas: Un usuario quiere eliminar una pasantía.
- Su empresa asociada se puede eliminar si la empresa no está relacionada con otra pasantía.
- Si es así, se pueden eliminar las ubicaciones de la empresa asociada.
- El estudio relacionado no se verá afectado.
escenario Estudio: Un usuario desea eliminar un estudio.
- Su tema asociado se puede eliminar si ningún otro estudio se refiere a este tema.
- Su universidad asociada (instalación) se puede eliminar si no hay otro estudio se refiere a esta universidad.
- Sus prácticas asociadas se pueden eliminar. La empresa solo puede ser eliminada si no se refiere a ninguna otra pasantía.
estoy totalmente seguro de si puedo añadir :dependent => :destroy
sólo después has_one
y has_many
o también después de belongs_to
.
Editar: Para simplificar el problema, siga la implementación de ejemplo siguiente (reducida).
class Study < ActiveRecord::Base
belongs_to :subject
accepts_nested_attributes_for :subject, :allow_destroy => true
end
class Subject < ActiveRecord::Base
has_many :studies, :dependent => :destroy
end
En mi opinión proporciono el siguiente enlace.
<%= link_to "Destroy", study, :method => :delete, :confirm => "Are you sure?" %>
La ruta se basa en las rutas con nombre dadas por una configuración de descanso en routes.rb
.
resources :studies
resources :subjects
El estudio se eliminará cuando haga clic en el enlace - los temas permanecen intactos. ¿Por qué?
Puede agregar ': dependent =>: destroy' a todos los tres – lebreeze
¿Podría indicar dónde exactamente ponerlo? – JJD