Рельсы Полиморфная ассоциация + fields_for - PullRequest
0 голосов
/ 13 августа 2011

Я пытаюсь обдумать, как настроить эту схему с полиморфными ассоциациями:

a «Документ» имеет один объект метаданных, но это может быть «PDFMetaData» или «TXTMetaData».

Мои опасения:

Чтобы установить эту связь, я могу сделать это

class Document
  belongs_to :metadata, :polymorphic => true
end

class PDFMetaData
  has_one :document, :as => :metadata
end

class TXTMetaData
  has_one :document, :as => :metadata
end

Это работает, но для меня это как бы наоборот: у документа есть объект метаданных, а не напротив?

Кроме того, я действительно сталкиваюсь с проблемами при попытке создать вложенную форму для моего нового документа. Я знаю, что могу использовать fields_for, но как узнать, что это за объект? (PDFMetaData или TXTMetaData). Нужно ли обрабатывать отдельные части в зависимости от типа документа?

Боюсь, что последний связан с моим первым вопросом, и что я делаю что-то ужасно неправильное.

Спасибо

1 Ответ

0 голосов
/ 13 августа 2011

Несмотря на то, что я вижу, откуда вы идете, по поводу путаницы с расположениеморяд_предоставляется в этом случае, обоснование основано на том, где в схеме БД находится ключ Foreign_key.Таблица документов содержит foreign_key, который связывает его с объектом PdfMetaData, поэтому не имеет смысла описывать отношения наоборот, поскольку не было бы никакого способа иметь отношение has_many (как бы вы сохранили несколько внешних ключей встрока базы данных?)

Надеюсь, это имеет смысл ... но для второй проблемы решение зависит от списка допустимых атрибутов ваших классов TXTMetaData и PDFMetaData.Если они имеют одинаковые атрибуты (или, по крайней мере, те, которые вы хотите, чтобы они были доступны в вашей форме, совпадают), тогда вы должны быть в порядке с

fields_for :metadata do |meta_fields|
  meta_fields.text_field :attr
  meta_fields.text_fields :attr2
end

и т. Д.

Если вы хотитечтобы выставить другие атрибуты, я бы предложил определить класс вашего объекта метаданных и действовать соответственно, например

meta_obj = document.metadata
fields_for :metadata, meta_obj do |meta_fields|
  if meta_obj.is_a?(PDFMetaData)
    meta_fields.text_field :attr
    meta_fields.text_fiels :attr2
  elsif meta_obj.is_a?(TXTMetaData)
    meta_fields.text_field :other_attr
    meta_fields.text_fiels :other_attr2
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...