2010-07-27 5 views
0

Это должно быть легко. Я точно не знаю, как назвать этот вопрос. У меня есть набор модулей, которые могут быть добавлены в мою CMS (страница, ссылка, форма ...), все они связаны через полиморфную связь с одной таблицей, которая управляет обычными вещами, такими как родословная, и включены ли они и т. Д. Поскольку я делаю «страницу», например, я обрабатываю создание этой другой записи таблицы автоматически. Все, что мне нужно передать, это parent_id. Чтобы сделать это, я создал прокси-сервер с помощью модели страницы:Как сохранить идентификатор в классе модели

def parent_id=(parent_id) 
    @parent_id = parent_id.blank? ? nil : parent_id.to_i 
    component_instance.parent_id = @parent_id 
    end 

    def parent_id 
    @parent_id ||= component_instance.parent_id 
    end 

component_instance является полиморфной ассоциацией.

Вы можете видеть, что, когда parent_id установлен на странице, я делаю какую-то магическую проверку, чтобы убедиться, что она пустая, и если да, установите значение @parent_id равным nil, иначе я превращу ее в целое число, а затем назначьте его компоненту_инсталляции, который будет применять его по мере необходимости, когда вся сборка page/component_instance будет сохранена в базе данных.

Мне нужно было сделать blank? nil : parent_id.to_i, потому что вспомогательный помощник формы ожидает целое число и не работает со строковым значением для id.

Вопрос в том, правильно ли я делаю это, или есть лучший способ превратить идентификатор строки в ниль или целое число в зависимости от того, существует ли оно или нет?

+0

Почему ваш parent_id никогда не будет строкой? Что-то здесь не складывается. – jdl

+0

Потому что он исходит из хэша params. Все в параметрах передается как строка, не так ли? –

ответ

0

Я закончил тем, делегируя установку этих «виртуальный» атрибуты фактической модели, где они были «реальными»:

delegate :parent_id, :parent_id=, :to => :component_instance, :allow_nil => true 

Сэйвы необходимости приведения типа атрибута первым.

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