Извините за некропостинг, но я не нашел здесь точной информации в ответах, если вам нужно решение для , укажите поля, которые следует обнулить:
module EnforceNil
extend ActiveSupport::Concern
module ClassMethods
def enforce_nil(*args)
self.class_eval do
define_method(:enforce_nil) do
args.each do |argument|
field=self.send(argument)
self.send("#{argument}=", nil) if field.blank?
end
end
before_save :enforce_nil
end
end
end
end
ActiveRecord::Base.send(:include, EnforceNil)
Таким образом:
class User
enforce_nil :phone #,:is_hobbit, etc
end
Применение определенного поля удобно, когда, скажем, у вас есть field1 и field2. Field1 имеет уникальный индекс в SQL, но может быть пустым, поэтому вам нужно принудительное применение (NULL считается уникальным, "" - не SQL), но для field2 вас это не волнует, и у вас уже есть десятки обратных вызовов или методов, которые работают когда field2 равно "", но будет копать ваше приложение под слоем ошибок, если field2 равно nil
. Ситуация, с которой я столкнулся.
Может быть кому-нибудь пригодится.