Pourquoi Rails5 utilise ApplicationRecord au lieu D'ActiveRecord:: Base?

nous savons que les Rails 5 ajouté ApplicationRecord comme classe abstraite héritée par nos modèles (ActiveRecord).

mais fondamentalement, je pense que chaque exigence technique que nous faisons avec ApplicationRecord, nous pouvons aussi faire avec ActiveRecord::Base. Par exemple:

module MyFeatures
  def do_something
    puts "Doing something"
  end
end

class ApplicationRecord < ActiveRecord::Base
  include MyFeatures
  self.abstract_class = true
end

donc maintenant chaque modèle sera attaché les comportements de MyFeatures. Mais nous pouvons aussi y parvenir dans les Rails 4:

ActiveRecord::Base.include(MyFeatures)

alors quel est l'avantage d'utiliser ApplicationRecord, pensez-vous qu'il est nécessaire d'ajouter ApplicationRecord?

40
demandé sur Hieu Pham 2016-05-21 09:10:45

2 réponses

alors qu'il peut sembler le même dans les applications de Rails de base, il y a en fait une différence importante une fois que vous commencez à utiliser des moteurs de rails, des plugins / gemmes ou des méthodes directes de ActiveRecord::Base.

  • ActiveRecord::Base.include(MyFeatures) se mélange directement dans ActiveRecord::Base et il est présent pour toujours pour tous les usages ultérieurs de ActiveRecord::Base (il ne peut pas être "mélangés") et il n'y a aucun moyen d'obtenir l'original ActiveRecord::Base plus dans n'importe quel code après l'inclusion. Cela peut facilement conduire à des problèmes si certains de la fonctionnalité mixed in a changé le comportement par défaut ActiveRecord ou si par exemple deux moteurs / gemmes essayé d'inclure les mêmes méthodes nommées.

  • d'autre part, le ApplicationRecord approche rend les éléments uniquement pour les classes (modèles) qui héritent de, d'autres classes, ainsi que l'utilisation directe d' ActiveRecord::Base rester vierge, épurée par les caractéristiques du module.

Ceci est particulièrement important quand les moteurs ou les rails sont des plugins sont utilisés, car il permet de séparer leur propre modèle logique de l'application principale du modèle logique qui n'était pas possible avant ApplicationRecord.

Tout cela est aussi bien décrite dans ce billet de blog et c'github commentaire.

52
répondu BoraMa 2016-05-21 07:43:47

ceci est pour développer la réponse de @BoraMa, et pour, espérons-le, clarifier une certaine confusion autour de ActiveRecord::Base.abstract_class.

ActiveRecord::Base.abstract_class retourne au moins aux Rails 3.2.0 (http://api.rubyonrails.org/v3.2.0/classes/ActiveRecord/Inheritance/ClassMethods.html), qui a été publié le 20 janvier 2012.

Rails 4.0.0 amélioration de la documentation: http://api.rubyonrails.org/v4.0.0/classes/ActiveRecord/Inheritance/ClassMethods.html

donc, à tout le monde qui pense ApplicationRecord est radicalement nouveau, ce n'est pas le cas. C'est une amélioration, pas un changement radical. Rien n'a été ajouté à ActiveRecord::Base pour que ça marche.

j'ai fait la même chose sur un projet Rails 4.2.6 parce que les modèles ont utilisé UUIDs pour les ids au lieu des entiers, et cela a exigé un changement à la valeur par défaut ORDER BY. Ainsi, au lieu d'utiliser le copier-coller ou un souci, je suis allé avec l'héritage en utilisant un UuidModel classe et self.abstract_class = true.

5
répondu Jordan Pickwell 2016-12-29 00:30:10