Я пытаюсь построить полиморфные отношения из вложенной формы, которая обратна ко всем найденным мной примерам. Я надеюсь, что кто-то укажет на ошибку моих путей.Rails 3 Полиморфные вложенные атрибуты
class Container < ActiveRecord::Base
belongs_to :content, :polymorphic => true
end
class Notice < ActiveRecord::Base
has_one :container, :as => :content
end
class Form < ActiveRecord::Base
has_one :container, :as => :content
end
Кажется, что большинство людей будут строить контейнер из уведомления или формы, но в моем случае уведомление или форма содержит небольшое количество контента (местоположение файла или пару полого БД), так что это очень сухой чтобы создать уведомление или форму из контейнера.
Я думал, что я мог бы решить, добавив accepts_nested_attributes_for :content
, но это дает мне unrecognized attribute :notice
, когда я пытаюсь создать контейнер с вложенным Уведомлении (если смотреть на содержание, а не полиморфные ассоциации)
Я могу сделать это вручную, так и в явном виде исключить вложенные поля, такие как
if params[:container].has_key('notice')
@c = Container.new(params[:container].except(:notice))
а затем построить, но разве это не запах? Есть ли способ лучше?
Благодарим за понимание!
Хм. Я думал, что он будет знать, какой объект создать так же, как я, с помощью ключа simple_fields_for. Если я упоминаю has_one, я теряю способность делать Container.find (1) .content.get_data, где get_data определена в Уведомлении и Форме. – Questor
Тогда вы можете изменить это, чтобы использовать STI и унаследовать уведомления и формы от абстрактного класса Content. Кроме того, вы можете создать вспомогательный метод и/или кеш в модели Container для поиска содержимого. – PinnyM
+1 для abstract_class. Я пошел с STI, но посмотрю в .abstract_class = true, чтобы удалить дублированные поля. Благодаря! – Questor