Best Practice für leere Zugehörigkeit zur Assoziation

74

Stellen Sie sich folgende Situation vor:

Ich habe ein dogModell und ein houseModell. Ein Hund kann zu einem Haus gehören, und ein Haus kann viele Hunde haben, also:

Class Dog <  ActiveRecord::Base
  belongs_to :house
end

Class House < ActiveRecord::Base
  has_many :dogs
end

Stellen Sie sich vor, ich möchte auch Hunde schaffen, die kein Haus haben. Sie gehören nicht zum Haus. Kann ich diese Beziehungsstruktur weiterhin verwenden und :house_idbeim Erstellen einfach keine Informationen angeben?

Gibt es eine bessere Praxis?

Anmerkung: Ich habe diese Analogie verwendet, um mein Problem zu vereinfachen, aber meine reale Situation ist: Ich habe ein Modell, das ein Benutzer Instanzen davon generieren kann. Er kann auch Sammlungen dieser Instanzen erstellen, eine Instanz jedoch außerhalb einer Sammlung belassen.

João Daniel
quelle
2
Ja, house_id nulldu kannst gehen und wann du @dog.housees zurückbringen wirst nilund so kannst du es überprüfen if @dog.houseund so weiter.
Rubyprince
2
Um sicherzustellen, dass dies funktioniert, sollte die Dog-Tabelle in Ihrer Datenbank nicht den Null-Teil von enthalten t.integer "house_id", :null => false.
Ashitaka

Antworten:

27

Ich denke, es ist ein absolut normaler Ansatz.

Sie können einfach house_idmit nullWert in der Datenbank für die Modelle belassen, die nicht zu anderen gehören.

Flexoid
quelle
329

Seien Sie vorsichtig damit in Rails 5 ...

Gehört_zu ist standardmäßig erforderlich

Von nun an verfügt jede Rails-Anwendung über eine neue Konfigurationsoption config.active_record.belongs_to_required_by_default = true. Beim Versuch, ein Modell zu speichern, bei dem keine Zuordnungen vorhanden sind, wird ein Validierungsfehler ausgelöst.

config.active_record.belongs_to_required_by_default kann in false geändert werden und mit diesem Verhalten das alte Rails beibehalten, oder wir können diese Validierung für jede Zugehörigkeit zur Definition deaktivieren, indem wir eine zusätzliche optionale Option übergeben: true wie folgt:

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

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

Wibbly
quelle
30
Dies ist die Antwort auf Rails 5 Benutzer
Iván Cortés Romero
3
Verbrachte 2 Nächte in diesem ... danke Jungs. Kann optional bestätigen: true macht den Trick. Mein Anwendungsfall war: class User < ApplicationRecord belongs_to :team, optional: true end class Team < ApplicationRecord has_many :users end
Ryan Buckley