Was ist ein gutes Design für ein Zwischen Triple-Relation-Modell?
-
08-07-2019 - |
Frage
Ich bin neu in Rails und greifen noch nicht alle Möglichkeiten mit den Verbänden. Hier ist mein Problem:
Ich habe ein paar Modelle wie Apfel und Zitrone. Dann gibt es das Modell ‚Relation‘, die Tripel der Beziehungen gilt:
Thema | Beziehung | Objekt
Apfel | ist süßer als | Zitrone
Die Migration für 'Beziehungen' ist dies:
create_table :relations do |t| t.references :subject, :polymorphic => true t.string :relation t.references :object, :polymorphic => true t.timestamps end
Dies sollte speichern Beziehungen wie
subject_id = 1
subject_type = Apfel
Relation = ist süßer als
object_id = 2
object_type = Zitrone
In Wirklichkeit habe ich mehr als nur zwei Modelle, also dachte ich, ich brauche, um das Thema zu machen und Objektspalt modellunabhängig durch die polymorphe Option.
Wie würden Sie setzen die Verbände in den Modellklassen von Apfel, Zitrone und Beziehung? Ist die Tabelle Design der Beziehungen gut so?
Vielen Dank für Ihre Hilfe !!
-Alex
Lösung
Geben Sie das DB-Schema Sie beschrieben, scheint, wie sollte es recht einfach sein:
class Relation < ActiveRecord::Base
belongs_to :object, :polymorphic => true
belongs_to :subject, :polymorphic => true
end
Und Ihre andere Klassen würde wie folgt aussehen
class Apple < ActiveRecord::Base
has_many :object_relations, :class_name => 'Relation', :as => :object
has_many :subject_relations, :class_name => 'Relation', :as => :subject
end
class Orange < ActiveRecord::Base
has_many :object_relations, :class_name => 'Relation', :as => :object
has_many :subject_relations, :class_name => 'Relation', :as => :subject
end
Andere Tipps
polymorph PAIN:
Wenn Sie es dringend benötigen, verwenden Sie somethimng wie SingleTableInheritance:
class Fruit < ActiveRecord::Base
has_many :relations
has_many :related_objects, :through => :relation, :class_name => 'Fruit'
has_many :relating_subjects, :through => :relation, :class_name => 'Relation'
end
class Relation < ActiveRecord::Base
belongs_to :object, :class => 'Fruit'
belongs_to :subject, , :class => 'Fruit'
validate_presence_of :object_id
validate_presence_of :subject_id
validate_presence_of :relation
end
Und dann wie:
class Apple < Fruit
...
end
Ich hoffe, das hilft, (ich habe diesen Code nicht getestet)