RoR: я должен использовать полиморфный - PullRequest
0 голосов
/ 15 июля 2010

Я работаю над проектом, с которым у многих моделей ActiveRecord может быть связан разговор. Пользователи могут обсуждать практически все аспекты сайта. У меня есть две идеи относительно того, как это должно быть реализовано.

1) Используйте в активе принадлежащий принадлежность, а не беседу - беседа не будет полностью осведомлена о его активе

class Product< ActiveRecord::Base
  belongs_to :conversation
end

class PurchaseOrder < ActiveRecord::Base
  belongs_to :conversation
end

2) Использовать в разговоре a__:, polymorphic => true

class Conversation < ActiveRecord::Base
  belongs_to :asset, :polymorphic => true
end

class Product < ActiveRecord::Base
  has_one :conversation, :as => :asset
end

class PurchaseOrder < ActiveRecord::Base
  has_one :conversation, :as => :asset
end

Как правильно моделировать эти отношения? Если бы мне нужно было заявить об отношениях, я бы сказал, что «заказ товара / покупки может состоять из одного разговора».

1 Ответ

0 голосов
/ 15 июля 2010

Я думаю, это зависит от того, что, если что-то, одна модель в отношениях должна знать о другой.Мне кажется, из вашего описания, что второй подход более уместен в этом случае.Почему?

  • Модели Product и PurchaseOrder являются самоограниченными сущностями в том смысле, что они могут существовать отдельно от разговоров о них.Таким образом, вы, вероятно, не хотите, чтобы внешние ключи загрязняли эти модели для привязки к разговорам.В этом смысле отношения должны быть ненавязчивыми.
  • A Conversation логически зависит от сущности, с которой он связан, поэтому у него есть внешние ключи asset_idasset_type), и это, вероятно, разумно

Это очень распространенный вопрос, который всегда заставляет меня задуматься.Это не всегда очевидно.Есть хорошая статья, рассматривающая проблему здесь

...