Обратные полиморфные ассоциации - PullRequest
5 голосов
/ 15 августа 2010

У меня есть родительский объект Post, у которого есть следующие дочерние элементы.

has_one :link
has_one :picture
has_one :code

Эти дети взаимоисключающие.

Есть ли способ использовать полиморфные ассоциации в обратном порядке, чтобы мне не приходилось иметь поля link_id, picture_id и code_id в моей таблице Post?

Ответы [ 3 ]

8 голосов
/ 26 сентября 2011

Я написал небольшой Гист, показывающий, как это сделать: https://gist.github.com/1242485

0 голосов
/ 16 августа 2010

Есть ли способ использовать полиморфный ассоциации в обратном порядке, так что я не обязательно иметь link_id, Поля picture_id и code_id в моем Почтовый стол?

has_one подразумевает, что внешний ключ находится в таблице other . Если вы действительно определили свою модель таким образом, то у вас не будет link_id, picture_id и code_id в вашей таблице сообщений. Я думаю, что вы хотели сказать belongs_to.

Я хочу сделать что-то вроде @ post.postable и получи ребенка объект, который будет одним из ссылок, картинка или код.

Я полагаю, что вы могли бы сделать это, используя STI и комбинируя таблицы links, pictures и codes, а затем проверяя тип модели при извлечении. Хотя это кажется глупым и может привести к множеству неиспользуемых столбцов.

Есть ли причина не хранить неиспользуемые столбцы идентификаторов, кроме экономии места? Если вы хотите сохранить их, тогда вы можете определить виртуальный атрибут и столбец postable_type: (непроверенный код, возможно, не получится впечатляюще)

def postable
  self.send(self.postable_type)
end

def postable=(p)
  self.send(postable_type.to_s+"=",p)
end
0 голосов
/ 15 августа 2010

Полагаю, вы ищете вариант :as для has_one. Позволяет указать имя конца ассоциации belongs_to.

Если ничего не помогает, прочитайте документы: http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_one

...