33 votes

Comment implémenter un modèle singleton

J'ai un site dans rails et je veux avoir des paramètres pour tout le site. Une partie de mon application peut notifier l'administrateur par SMS si un événement spécifique se produit. Il s'agit d'un exemple de fonctionnalité que je souhaite configurer via les paramètres du site.

Alors je me suis dit que je devrais avoir un modèle de réglage ou quelque chose comme ça. Il doit s'agir d'un modèle car je veux pouvoir utiliser la fonction has_many :contacts pour la notification par SMS.

Le problème est qu'il ne peut y avoir qu'un seul message dans la base de données pour le modèle de paramètres. J'ai donc pensé à utiliser un modèle Singleton, mais cela ne fait qu'empêcher la création d'un nouvel objet, n'est-ce pas ?

Devrais-je encore créer des méthodes getter et setter pour chaque attribut, comme suit ?

def self.attribute=(param)
  Model.first.attribute = param
end

def self.attribute
  Model.first.attribute
end

N'est-il pas préférable de ne pas utiliser directement Model.attribute mais de toujours créer une instance de celui-ci et de l'utiliser ?

Que dois-je faire ici ?

1voto

araslanov_e Points 189
class Constant < ActiveRecord::Base
  after_initialize :readonly!

  def self.const_missing(name)
    first[name.to_s.downcase]
  end
end

Constant::FIELD_NAME

1voto

user3049407 Points 31

Vous pouvez le faire comme ça :

 class Config < ApplicationRecord
  def self.instance
    Config.first || Config.create!
  end
 end

0voto

Je suppose que pour utiliser la colonne d'héritage type avec la contrainte uniq.

# miragtion
class CreateSingletonRecords < ActiveRecord::Migration[5.2]
  create_table :balance_holders do |t|
    t.string :type
    t.index :type, unique: true

    t.timestamps
  end
end

plusieurs méthodes de votre classe parent :

class SingletonRecord < ApplicationRecord
  class << self
    def instance
      @singleton__instance__
    end

    def load_record(params = {})
      @singleton__instance__ = find_or_create_by!(params)
    end
  end

  load_record

  validates :type, uniqueness: true
end

Après cela, vous pouvez toujours utiliser un enregistrement unique pour la classe de modèle singleton. Votre instance sera chargée ou créée une fois pendant le chargement de la classe de modèle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X