Я следую этому шаблону, чтобы гарантировать, что все мои атрибуты нормализованы перед сохранением:
class MyModel < ApplicationRecord
before_validation :normalize_attributes
def normalize_attributes
self.name&.strip!
self.email&.strip!
end
end
У меня есть и другие, более сложные:
def normalize_attributes
# Transform to array if it is a string with things
# separated by comas
if self.favorite_things.is_a? String
self.favorite_things = self.favorite_things.split(",").map(&:strip)
end
end
Это работает, но проблема в том, что когда я добавляю этот атрибут к serialized, он терпит неудачу:
serialize :favorite_things, Array
Как здесь:
my_model.update(favorite_things: "ONE, TWO, THREE")
Ошибка:
Error:
ActiveRecord::SerializationTypeMismatch: can't serialize `favorite_things`: was supposed to be a Array, but was a String. -- "ONE, TWO, THREE"
Похоже, что команда serialize выполняется раньше before_validation.
Как я могу очистить атрибуты перед их сериализацией?





Чтобы гарантировать, что все ваши атрибуты нормализованы перед сохранением, перезапишите установщики:
class MyModel < ApplicationRecord
# @param value [String]
# @return [String]
def name=(value)
super(value.strip)
end
# @param value [String]
# @return [String]
def email=(value)
super(value.strip)
end
# @param value [String, Array]
# @return [Array]
def favorite_things=(value)
return super(value) unless value.is_a? String
super(favorite_things.split(",").map(&:strip))
end
end
Да, это то, что я хотел сделать. Мне больше понравилась идея объединить все нормализации в одном методе. Но похоже, что это единственный вариант, который работает с
serialize