Как лучше создать экземпляр модели STI? - PullRequest
1 голос
/ 03 марта 2011

Обычно можно создать связанный экземпляр модели через его родительский объект:

@child = @parent.children.build(params[:child])

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

@child = params[:type].classify.constantize.new(params[params[:type]])
@child.parent = @parent

Это лучший способ?Я использую один контроллер для построения всех различных типов подклассов, поэтому мне нужно предоставить тип в качестве параметра.

1 Ответ

0 голосов
/ 03 марта 2011

Я обычно использую этот трюк:

class BaseModel < ActiveRecord::Base

private
  # this will enable you to set the type field 
  def attributes_protected_by_default
    super - [self.class.inheritance_column]
  end
end

Теперь в вашем контроллере:

@parent.children.build(params[:base_model])

Убедитесь, что хэш params [: base_model] имеет поле с именем type.Я обычно добавляю скрытое поле формы для хранения типа.

Убедитесь, что вы добавили соответствующие проверки для создания правильных подтипов.

Примечание : этот приемне будет работать в Rails 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...