Можно ли определить, был ли установлен атрибут ActiveRecord, отличный от значения по умолчанию? - PullRequest
0 голосов
/ 22 июня 2010

У нас есть модель ActiveRecord, столбцы которой имеют некоторые значения по умолчанию.Он также имеет условие проверки так, что, если для свойства 'profile' установлено другое значение, значения по умолчанию являются недействительными.

Мне бы хотелось иметь возможность определять, имеют ли атрибутыбыло установлено , поскольку для них было установлено значение по умолчанию , чтобы я мог сбросить их на новые, действительные значения перед проверкой.

Возможно ли это?

ОБНОВЛЕНИЕ: Непонятночто я имею в виду, поэтому я должен привести примеры кода.

Таблица определена так:

t.column :profile, :string
t.column :contact_by, :string, :default => "phone", :null => false

Проверка выглядит так:

validate :validate_contact_by_for_profile1
def validate_contact_by
  if (profile == "profile1") && (contact_by != "email")
    errors.add(:contact_by, " must be 'email' for users in profile1")
  end
end

Так что любойКогда мы сделаем это:

u = User.new
u.profile => profile1

В итоге u будет недействительным.Я хочу закончить тем, что для contact_by пользователя по умолчанию установлено значение «телефон», но если для его профиля установлено значение profile1, то оно меняется на «электронная почта», если в то же время не было установлено какое-либо значение.(В идеале это включает в себя установку его на «телефон»)

1 Ответ

0 голосов
/ 22 июня 2010

Отредактированный ответ: хорошо, не знаю, понял ли я, но я попробую: 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

...