Модификация модели рельсов во время выполнения - PullRequest
1 голос
/ 18 апреля 2011

на предыдущий вопрос я искал способ динамическая проверка моих моделей.

Рекомендации по валидации "Динамической" модели

Решение, которое я получил, это:

def after_initialize        
  singleton = class << self; self; end

  validations = eval(calendar.cofig)

  validations.each do |val|
    singleton.class_eval(val)
  end
end

В моем реальном приложении у меня есть 2 модели

class Calendar < ActiveRecord::Base
  has_many :events
end

class Event < ActiveRecord::Base
  belongs_to :calendar

  def after_initialize        
    singleton = class << self; self; end

    validations = eval(calendar.cofig)

    validations.each do |val|
       singleton.class_eval(val)
    end
 end

end

Как видите, код проверки, который должен быть добавлен в класс Event, находится в поле календаря "config".

Отлично работает для существующего события, но не для новой записи. Это потому, что во время вызова after_initialize ассоциация еще не существует.

Я не могу найти способ сделать это, кроме помещения значений конфигурации в само событие.

Есть какие-нибудь советы?

Tks!

1 Ответ

0 голосов
/ 18 апреля 2011

Возможно, вы захотите запустить свой код проверки на этапе проверки, а не на этапе инициализации.Попробуйте это:

class Calendar < ActiveRecord::Base
  has_many :events
end

class Event < ActiveRecord::Base
  belongs_to :calendar

  validate do |event|
    validations = eval(calendar.cofig)
    validations.each do |val|
      eval(val)
    end
  end
end
...