Как создать ассоциацию has_many с несколькими типами? - PullRequest
4 голосов
/ 05 марта 2012

У меня есть следующее:

  • Ссылка на модель
  • модель LinkItem, которой я хочу быть следующего типа
    • комментарий
    • тег
    • ...

Я использую этот код:

Ссылка модель

class Link < ActiveRecord::Base  
  has_many :link_items  
end

Модель LinkItem

class LinkItem < ActiveRecord::Base
  belongs_to :link
end

class Comment < LinkItem
end

class Tag < LinkItem
end

Теперь я не знаю, как сказать Rails, что моя модель LinkItem должна быть полиморфной. Я читал Руководство по Rails по ассоциациям и другим учебным пособиям, но они просто описывают, как создать ассоциативную принадлежность для нескольких других моделей, а не наоборот.

Так что мой вопрос будет:
Как создать ассоциацию has_many, в которой связанные экземпляры могут быть разных типов? Или было бы лучше создать отдельные модели для комментариев, тегов и т. Д. И просто связать каждую из них по отдельности с моей моделью Link?

EDIT
На самом деле мой код работает.
Я просто попытался использовать столбец «type» (вместо «link_item_type») в моей базе данных, и rails автоматически использовал его для сохранения / определения правильного подкласса моих LinkItems (спасибо Wizard of Ogz за подсказку)
Однако я все еще не могу получить доступ к подклассам LinkItem без предварительной ссылки на LinkItem. Это какая-то ленивая загрузка?

Ответы [ 4 ]

2 голосов
/ 06 марта 2012

Если вы ищете полиморфную ассоциацию nicholaides имеет правильный путь.Если вы ищете полиморфную ассоциацию has_meny, посмотрите ответ на вопрос «Настройка полиморфного отношения has_many: through» .

0 голосов
/ 24 августа 2013

Я много пользователей полиморфных ассоциаций!

Сначала я посмотрел бы RailsCast , а затем документацию , предложенную nicholaides .

Это прекрасно объясняет, как создать обе стороны ассоциации.

0 голосов
/ 24 августа 2013

Я только что имел дело с тем же вопросом.

Мое имя для моей модели было неверным. Сначала я создал его с одним именем (например, link_tag.rb), а затем изменил имя класса (например, с LinkTag на Tag) на лету, не меняя имя файла (например, tag.rb).

Когда я правильно переименовал файл, он работал как положено.

В итоге, имя файла, которое должно совпадать с именем класса.

Я знаю, что этот пост немного староват, но, возможно, это когда-нибудь кому-нибудь поможет!

0 голосов
/ 05 марта 2012

Это называется полиморфной ассоциацией.Вот некоторая документация .

...