2012-05-05 19 views
46

Imagine la siguiente situación:mejores prácticas sobre la asociación belongs_to vacío

tengo un modelo dog y un modelo house. Un perro puede pertenecer a una casa y una casa puede tener muchos perros, así:

Class Dog < ActiveRecord::Base 
    belongs_to :house 
end 

Class House < ActiveRecord::Base 
    has_many :dogs 
end 

Ahora, imagina que yo también quiero crear perros que no tienen una casa. Ellos no pertenecen a la casa. ¿Puedo seguir usando esa estructura de relación y simplemente no informar un :house_id al crearlo?

¿Hay una mejor práctica?

Obs .: Utilicé esta analogía para simplificar mi problema, pero mi situación real es: tengo un modelo que un usuario puede generar instancias de él. También puede crear colecciones de esas instancias, pero puede dejar una instancia fuera de una colección.

+2

yes..you puede dejar '' house_id' null' y cuando '@ dog.house' se devolverá' las negativas y así se puede comprobar como 'si @dog. casa' y así sucesivamente .. – rubyprince

+2

Para asegurarse de que esto funcione, en su base de datos, la tabla Dog no debe tener la parte nula de 't.integer" house_id ",: null => false'. – Ashitaka

Respuesta

22

Creo que es un enfoque absolutamente normal.

Usted puede simplemente dejar house_id con null valor en la base de datos para los modelos que no pertenecen a otros.

199

tener cuidado con esto en los carriles 5 ...

belongs_to es requerido por defecto

partir de ahora cada aplicación Rails tendrá una nueva configuración opción config.active_record.belongs_to_required_by_default = true, activará un error de validación al intentar guardar un modelo donde belongs_to asociaciones no están presentes.

config.active_record.belongs_to_required_by_default se puede cambiar a falsa y con ello a mantener el comportamiento de edad rieles o podemos desactivar esta validación en cada definición belongs_to, simplemente pasando una opción adicional opcional: verdadera de la siguiente manera:

class Book < ActiveRecord::Base 
    belongs_to :author, optional: true 
end 

de: http://blog.michelada.io/whats-new-in-rails-5

+15

esta es la respuesta a Rails 5 usuarios –

+2

Pasé 2 noches en este ... gracias chicos. Puede confirmar opcional: verdadero hace el truco. Mi caso de uso fue: ' clase User

+0

Esto me guardan mucha rotación, gracias Ivan por la punta Rails5 . – Laurie

Cuestiones relacionadas