Я всегда находил документацию вокруг полиморфной ассоциации неясной. Например, из Руководство по рельсам :
При полиморфных ассоциациях модель может принадлежать нескольким другим моделям в одной ассоциации.
Я обнаружил, что у меня есть много случаев, когда модель принадлежит более чем одной другой модели. Например, если у меня есть модель 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)
Спасибо за любые разъяснения ....