Отредактированный ответ: хорошо, не знаю, понял ли я, но я попробую: P
вы можете написать метод для оверирования профиля = setter :
def profile=(value)
self.contact_by = 'email' if value == 'profile1'
super
end
этот способ работает так, как вы ожидаете:
> n = YourModel.new
=> #<YourModel id: nil, profile: nil, contact_by: "phone", ...>
> n.profile = 'profile2'
=> "profile2"
> n.contact_by
=> "phone"
> n.profile = 'profile1'
=> "profile1"
> n.contact_by
=> "email"
как вы можете видеть, таким образом, вы получаете то, что хотите.затем вы можете выполнить любую необходимую вам проверку.
надеюсь, на этот раз это помогло; -)
СТАРЫЙ ОТВЕТ: обычно вы устанавливаете значения по умолчанию во время переноса БД.поэтому, когда вы пытаетесь сохранить некоторые данные, модель ActiveRecord содержит пустые данные, а затем при сохранении в db получает значения по умолчанию.
в соответствии с этим вы можете поиграть с проверками в модели, используя что-то вроде этого:
validates_presence_of :some_field, :if => Proc.new {|m| p.profile != <default value>}
в качестве альтернативы, вы можете написать собственный код проверки, как частный метод, который будет вызываться из validate:
validate :your_custom_validation_method, :if => Proc.new {|m| p.profile != <default value>}
Кстати, я предлагаю вам взглянуть на документы ActiveRecord:http://guides.rails.info/active_record_validations_callbacks.html