Rails: force la chaîne vide à NULL dans la firebase database

Existe-t-il un moyen simple (c.-à-d. Une configuration) de forcer ActiveRecord à enregistrer des chaînes vides comme NULL dans la firebase database (si la colonne le permet)?

La raison en est que si vous avez une colonne de chaîne NULLable dans la firebase database sans valeur par défaut, les nouveaux enregistrements qui ne définissent pas cette valeur contiendront NULL, tandis que les nouveaux enregistrements qui définissent cette valeur sur la chaîne vide ne seront pas NULL. aux incohérences dans la firebase database que je voudrais éviter.

En ce moment je fais des choses comme ça dans mes modèles:

before_save :set_nil def set_nil [:foo, :bar].each do |att| self[att] = nil if self[att].blank? end end 

qui fonctionne mais n’est pas très efficace ou SEC. Je pourrais en tenir compte dans une méthode et la mélanger dans ActiveRecord, mais avant de suivre cette voie, j’aimerais savoir si cela existe déjà.

Essayez si ce bijou fonctionne:

https://github.com/rubiety/nilify_blanks

Fournit une structure pour enregistrer les valeurs vierges entrantes telles que nil dans la firebase database dans les cas où vous préférez utiliser DB NULL plutôt que simplement une chaîne vide …

Dans Rails, lorsque vous enregistrez un modèle depuis un formulaire et que les valeurs ne sont pas fournies par l’utilisateur, une chaîne vide est enregistrée dans la firebase database au lieu d’un NULL, comme le préférerait beaucoup (mélanger les blancs et les NULL). Ce plugin vous permet de spécifier une liste d’atsortingbuts (ou d’exceptions de tous les atsortingbuts) qui seront convertis en néant s’ils sont vides avant l’enregistrement d’un modèle.

Seuls les atsortingbuts répondant à blanc? avec une valeur de true sera converti en nil. Par conséquent, cela ne fonctionne pas avec les champs entiers avec la valeur 0, par exemple …

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

 before_save :normalize_blank_values def normalize_blank_values atsortingbutes.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 atsortingbutes.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 activez-le si nécessaire.

 module NormalizeBlankValues extend ActiveSupport::Concern def normalize_blank_values atsortingbutes.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 

Ma suggestion:

 # app/models/contact_message.rb class ContactMessage < ActiveRecord::Base include CommonValidations include Shared::Normalizer end # app/models/concerns/shared/normalizer.rb module Shared::Normalizer extend ActiveSupport::Concern included do before_save :nilify_blanks end def nilify_blanks attributes.each do |column, value| # ugly but work # self[column] = nil if !self[column].present? && self[column] != false # best way # self[column] = nil if self[column].kind_of? String and self[column].empty? end end end 

Une autre option consiste à fournir des parameters personnalisés, au lieu de gérer cela dans un hook. Par exemple:

 def foo=(val) super(val == "" ? nil : val) end 

Désolé pour le nécropostage, mais je n’ai pas trouvé la réponse exacte ici, si vous avez besoin d’une solution pour spécifier les champs qui doivent être nilifiés:

 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) 

Par ici:

 class User enforce_nil :phone #,:is_hobbit, etc end 

L’application de certains champs est pratique lorsque nous disons que vous avez un champ1 et un champ2. Field1 possède un index unique en SQL, mais peut être vide, vous avez donc besoin d’une application (NULL considéré comme unique, “” et non par SQL), mais pour field2, vous ne disposez que de dizaines de callbacks ou de méthodes. lorsque field2 est “”, mais creusera votre application sous le calque des erreurs si field2 est nil . Situation à laquelle je fais face

Peut être utile pour quelqu’un.

J’utilise le gem normalisateur d’atsortingbut pour normaliser les atsortingbuts avant eux dans la firebase database.

Bande Atsortingbuts Gem

Il y a un petit bijou pratique qui le fait automatiquement lors de l’enregistrement d’un enregistrement, que ce soit dans un formulaire utilisateur ou dans la console ou dans une tâche de rake, etc.

Il s’appelle ssortingp_atsortingbutes et est extrêmement facile à utiliser, avec des valeurs par défaut parfaitement adaptées .

Il fait deux choses principales par défaut qui devraient presque toujours être faites:

  1. Supprimer les espaces blancs avant et arrière:

     " My Value " #=> "My Value" 
  2. Transformez les chaînes vides en NULL :

     "" #=> NULL " " #=> NULL 

Installer

Vous pouvez l’append à votre fichier gem avec:

gem ssortingp_atsortingbutes

Usage

Ajoutez-le à tous les modèles (ou à tous les modèles) dont vous souhaitez supprimer les espaces de début et de fin et transformez les chaînes vides en NULL :

 class DrunkPokerPlayer < ActiveRecord::Base strip_attributes end 

Utilisation avancée

Il existe des options supplémentaires que vous pouvez transmettre par modèle pour gérer les exceptions, comme si vous souhaitez conserver ou non des espaces blancs à la fin, etc.

Vous pouvez voir toutes les options du repository GitHub ici:

https://github.com/rmm5t/ssortingp_atsortingbutes#examples