2012-05-05 9 views
46

Wyobraźmy sobie następującą sytuację:Najlepsze praktyki o pusty belongs_to stowarzyszenie

Mam dog modelu i house model. Pies może należeć do domu, a dom może mieć wiele psów, więc:

Class Dog < ActiveRecord::Base 
    belongs_to :house 
end 

Class House < ActiveRecord::Base 
    has_many :dogs 
end 

Teraz wyobraź sobie, że ja też chcę stworzyć psy, które nie mają domu. Nie należą do domu. Czy nadal mogę używać tej struktury relacji i po prostu nie informuję o jej tworzeniu podczas tworzenia?

Czy istnieje lepsza praktyka?

Obs .: Użyłem tej analogii, aby uprościć mój problem, ale moja prawdziwa sytuacja jest taka: mam model, który może wygenerować jego użytkownik. Może również tworzyć kolekcje tych instancji, ale może pozostawić instancję poza zbiorem.

+2

może yes..you opuścić '' null' house_id' i kiedy '@ dog.house' go zwróci' zerowe, a więc można sprawdzić go jak 'jeśli @dog. house' i tak dalej .. – rubyprince

+2

Aby upewnić się, że to działa, w bazie danych tabela Dog nie powinna mieć pustej części 't.integer" id_domu ",: null => false'. – Ashitaka

Odpowiedz

22

Myślę, że to absolutnie normalne podejście.

Możesz po prostu zostawić house_id z wartością null w bazie danych dla modeli, które nie należą do innych.

199

Bądź ostrożny z tym w Rails 5 ...

belongs_to jest domyślnie wymagane

Odtąd każdej aplikacji Rails będzie mieć nową konfigurację opcji config.active_record.belongs_to_required_by_default = true, to spowoduje błąd sprawdzania poprawności podczas próby zapisania modelu, w którym nie ma stowarzyszeń belongs_to.

config.active_record.belongs_to_required_by_default można zmienić fałszywe i to zachować stare zachowanie Rails lub możemy wyłączyć to sprawdzanie na każdej definicji belongs_to, tylko przejazdem dodatkowy opcję opcjonalnie: true następująco:

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

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

+15

to jest odpowiedź dla użytkowników Rails 5 –

+2

Spędziłem 2 noce na tym ... dzięki chłopaki. Potwierdzenie opcjonalne: prawda robi lewę. Mój przypadek użycia było: 'class User

+0

To zaoszczędziło mi dużo ubijaniu, dzięki Ivan za cynk Rails5 . – Laurie