Полиморфная ассоциация - PullRequest
       19

Полиморфная ассоциация

8 голосов
/ 31 марта 2009

Если у вас есть полиморфные ассоциации own_to, то ссылки добавят оба необходимых столбца:

create_table :products do |t|
  t.references :attachment, :polymorphic => {:default => 'Photo'}
end

добавит столбец attachment_id и столбец строки attachment_type со значением по умолчанию «Фото».

Что именно это означает?

Ответы [ 3 ]

6 голосов
/ 31 марта 2009

Вот документация по методу ссылок: http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/TableDefinition.html#M001938

Код метода ссылок следующий:

497:       def references(*args)
498:         options = args.extract_options!
499:         polymorphic = options.delete(:polymorphic)
500:         args.each do |col|
501:           column("#{col}_id", :integer, options)
502:           column("#{col}_type", :string, polymorphic.is_a?(Hash) ? polymorphic : options) unless polymorphic.nil?
503:         end
504:       end

Как видите. Он добавляет в таблицу столбцы [col] _id и [col] _type.

Это то же самое, что сказать:

create_table :products do |t|
  t.integer :attachment_id
  t.string  :attachment_type, :default => 'Photo'
end

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

Хорошим примером может служить приложение, которое поддерживает теги, где теги могут быть связаны как с Products, так и с Categories.

В вашем примере похоже, что Продукты могут быть присоединены к нескольким типам объектов, где типом объекта по умолчанию является Фотография. (attachment_type будет «Фото», а attachment_id будет идентификатором строки в таблице «фото»)

4 голосов
/ 31 марта 2009

По сути, полиморфная ассоциация по определению добавляет возможность создавать ассоциации со многими другими моделями Rails ActiveRecord.

Оба столбца предназначены для того, чтобы Rails знал, на какую модель ссылается ассоциация, у вас есть столбец attachment_type (т. Е. String) (значение по умолчанию: «Photo», имя таблицы: photos в БД) и attachment_id является своего рода внешним ключом для этой конкретной Модели / таблицы (т. е. Фото).

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

0 голосов
/ 31 марта 2009

полиморфный означает, что он может принадлежать разным объектам (или разным записям в разных таблицах). Способ, которым это определяется, основан на полях типа и идентификатора. Если бы ваша ассоциация не была полиморфной, она имела бы только поле _id.

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