2010-08-15 2 views
5

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

has_one :link 
has_one :picture 
has_one :code 

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

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

+0

Имеет ли смысл иметь фотографию: has_many отношения? Тогда вы могли бы сделать то, что искали. – Trip

ответ

0

Я считаю, что вы ищете опцию :as для has_one. Он позволяет указать имя конца ассоциации belongs_to.

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

+0

Может быть, мне что-то не хватает, но как бы создать динамическую связь с дочерним, используя: as? Я понимаю полиморфизм в отношении того, как дочерний объект может иметь любой тип родительского объекта. Но я спрашиваю, как родительский объект может иметь любой тип дочернего объекта. Я хочу сделать что-то вроде @ post.postable и получить дочерний объект, который был бы одним из ссылок, изображений или кода. –

0

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

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

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

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

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

def postable 
    self.send(self.postable_type) 
end 

def postable=(p) 
    self.send(postable_type.to_s+"=",p) 
end 
+0

Я просто ищу более элегантный способ делать что-то, чем иметь несколько столбцов * _id. Хотя по мере того, как этот поток доказывает, подход нескольких столбцов * _id, вероятно, является самым простым и лучшим. –

Смежные вопросы