Mysql
 sql >> Base de données >  >> RDS >> Mysql

Rails :forcer la chaîne vide à NULL dans la base de données

Oui, la seule option pour le moment est d'utiliser un rappel.

before_save :normalize_blank_values

def normalize_blank_values
  attributes.each do |column, value|
    self[column].present? || self[column] = nil
  end
end

Vous pouvez convertir le code en mixin pour l'inclure facilement dans plusieurs modèles.

module NormalizeBlankValues
  extend ActiveSupport::Concern

  included do
    before_save :normalize_blank_values
  end

  def normalize_blank_values
    attributes.each do |column, value|
      self[column].present? || self[column] = nil
    end
  end

end

class User
  include NormalizeBlankValues
end

Ou vous pouvez le définir dans ActiveRecord::Base pour l'avoir dans tous vos modèles.

Enfin, vous pouvez également l'inclure dans ActiveRecord::Base mais l'activer si nécessaire.

module NormalizeBlankValues
  extend ActiveSupport::Concern

  def normalize_blank_values
    attributes.each do |column, value|
      self[column].present? || self[column] = nil
    end
  end

  module ClassMethods
    def normalize_blank_values
      before_save :normalize_blank_values
    end
  end

end

ActiveRecord::Base.send(:include, NormalizeBlankValues)

class User
end

class Post
  normalize_blank_values

  # ...
end