Каков хороший дизайн для промежуточной модели тройного отношения? - PullRequest
0 голосов
/ 07 мая 2009

Я новичок в Rails и пока не понимаю всех возможностей с ассоциациями. Вот моя проблема:

У меня есть пара моделей, таких как яблоко и лимон. Тогда есть модель 'отношение', которая содержит тройки отношений:

тема | отношение | объект

яблоко | слаще | лимон

Миграция для «отношений» такова:

create_table :relations do |t|
  t.references :subject,  :polymorphic => true
  t.string     :relation
  t.references :object,   :polymorphic => true
  t.timestamps    
end

это должно хранить отношения как

subject_id = 1

subject_type = apple

отношение = слаще

object_id = 2

object_type = lemon

На самом деле у меня более двух моделей, поэтому я подумал, что нужно сделать независимую от модели предмета и столбца объекта с помощью опции полиморфизма.

Как бы вы установили ассоциации в модельных классах яблока, лимона и отношения? Хорошо ли выглядит дизайн таблицы отношений?

Большое спасибо за вашу помощь !!

1032 * для -Alex- *

Ответы [ 2 ]

1 голос
/ 08 мая 2009

Дайте схему БД, которую вы описали, похоже, она должна быть довольно простой:

class Relation < ActiveRecord::Base
  belongs_to :object, :polymorphic => true
  belongs_to :subject, :polymorphic => true
end

А другие ваши классы будут выглядеть так

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
0 голосов
/ 08 мая 2009

Полиморфная боль:

Если вам это не нужно, используйте что-то вроде 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

А потом вроде:

class Apple < Fruit
   ...
end

Надеюсь, это поможет, (я не проверял этот код)

...