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
?
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 dansActiveRecord::Base
et il est présent pour toujours pour tous les usages ultérieurs deActiveRecord::Base
(il ne peut pas être "mélangés") et il n'y a aucun moyen d'obtenir l'originalActiveRecord::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.
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
.