3 votes

Quel est le meilleur modèle pour extraire la logique des modèles et faire persister les résultats dans la base de données ?

J'ai expérimenté différentes façons de structurer mon application, et en particulier les modèles basés sur ActiveRecord, en examinant la notion d'avoir une classe séparée dont les résultats sont sauvegardés dans un seul champ. La composition aurait pu fonctionner, mais il y a eu beaucoup de discussions sur son maintien ou non, donc je me demandais quelles alternatives vous pourriez avoir.

Exemple :

class Gadget < ActiveRecord::Base

  attr_accessor: lights

end

Maintenant, je voudrais que le lights doit être "gérée" par une classe totalement distincte :

class Lights

  def doSomething
  end

  def doSomethingElse
  end 

end

Quelle est la meilleure façon de déléguer cette logique en dehors de l'interface de l'application ActiveRecord et dans le modèle Lights afin de stocker les résultats de manière transparente ?

par exemple, en utilisant une instance du Lights comme la classe lights mais cela ne fonctionnera pas, puisqu'il n'y a pas d'association, n'est-ce pas ?

par exemple, utiliser method_missing pour transmettre toutes les demandes au lights mais cela ne fonctionnera pas non plus, car elle ne sera pas conservée dans la base de données.

Ce n'est peut-être pas possible, mais je suis intéressé par les moyens de conserver les résultats des opérations logiques. Toutes les suggestions sont les bienvenues.

4voto

apneadiving Points 64660

Pourquoi pas quelque chose comme :

class Gadget < ActiveRecord::Base

  def lights
    @lights ||= Lights.new(self)
  end

end

class Lights
  attr_reader :root
  delegate :save, :save!, to: :root

  def initialize(root)
    @root = root
  end

  def doSomething
  end

  def doSomethingElse
  end

  def method_missing(method_name, *args, &block)
    #delegate all setters to root
    if method_name =~ /.*=$/
      root.send(method_name, *args, &block)
    else
      super
    end
  end
end

Vous pouvez donc le faire :

gadget = Gadget.new
#say gagdet has a name column
gadget.lights.name = 'foo'
gadget.lights.save
gadget.name #=> 'foo'

Je ne sais toujours pas pourquoi vous en avez besoin, mais cela devrait fonctionner.

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