ActiveRecord: когда это полиморфно - PullRequest
0 голосов
/ 18 января 2011

Я всегда находил документацию вокруг полиморфной ассоциации неясной. Например, из Руководство по рельсам :

При полиморфных ассоциациях модель может принадлежать нескольким другим моделям в одной ассоциации.

Я обнаружил, что у меня есть много случаев, когда модель принадлежит более чем одной другой модели. Например, если у меня есть модель Company, модель Invoice и модель AccountPayable, я обнаружил, что могу просто сделать:

class Company < ActiveRecord::Base
   has_many :invoices
   has_many :account_payables
end
# not shown: Invoice and AccountPayable classes 
# with corresponding belongs_to associations

Кажется, это всегда работает нормально. Хотя, как я уже сказал, когда я читаю справку по полиморфности, у меня возникает ощущение, что я должен использовать ее для вышеуказанного случая.

Но тогда я думаю, что это не может быть правильно. Если мой простой пример, приведенный выше, является полиморфным, то это означает, что модель может «использоваться» только одной другой моделью, если вы не станете полиморфным. Это кажется чрезмерно ограничительным. Кроме того, примеры полиморфных имен интерфейсов, как правило, являются глаголами (например, «commentable» и т. Д.). Как мне превратить приведенный выше пример в глагол? Companyable?

Возможно, документация пытается сказать мне, что это, когда экземпляр модели может принадлежать только одному из связанных объектов и не более. Например, если компания может принадлежать только счетам или AP (но не обоим). Если это так, то мне кажется, что это больше похоже на наследование одной таблицы, чем на старый добрый has_many / own_to. Используя STI, я мог бы иметь class Creditor < Company... и class Debtor < Company... и связывать каждого из них со счетами и счетами соответственно. В моем приведенном выше примере вполне возможно, что данная Компания - это тот, кому я выставляю счет, и который также должен (т.е. AccountPayable)

Спасибо за любые разъяснения ....

Ответы [ 2 ]

0 голосов
/ 18 января 2011

Ваш вопрос довольно запутанный, и я думаю, что ваши модели не должны быть полиморфными.

Пример сценария, где потребуется полиморфизм.

(articles.rb) has_many article_comments
(photos.rb)  has_many photo_comments
(article_comments.rb) has_many article_comment_comments
(photo_comments.rb) has_many photo_comment_comments # repeat for comments on commments', comments etc.

v

(articles.rb) has_many comments, :as => commentable
(photos.rb) has_many comments, :as => commentable
(comments.rb) has_many comments, :as => commentable
0 голосов
/ 18 января 2011

Вы заявляете:

Нахожу, у меня много случаев, когда модель принадлежит более чем одной другой модели. Например, если у меня есть модель компании, модель счета-фактуры и расчетный счет модель, я нашел, я могу просто сделать:

Но приведенный вами пример на самом деле относится к модели, которая "has_many" более чем к одной другой модели.

Модель с принадлежащим_ означает, что она должна указывать внешний ключ, и если он принадлежит более чем одной модели, то как узнать, на какую модель ссылается внешний_ключ Именно эту проблему вам помогут решить полиморфные ассоциации.

Пример, который вы приводите выше, абсолютно безупречен и не требует полиморфных ассоциаций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...