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

War es hilfreich?

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)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top