Je suis nouveau dans la nouvelle interface de requête d'ActiveRecord et je suis encore en train de comprendre certaines choses.
J'espérais que quelqu'un pourrait expliquer la différence entre l'utilisation d'une scope
dans un modèle ActiveRecord et en utilisant simplement une méthode de classe (c'est à dire self.some_method
)
D'après ce que je peux comprendre, on s'attend toujours à ce qu'un scope renvoie une relation, alors qu'une méthode de classe ne doit pas nécessairement le faire. Cela est-il vrai ?
Par exemple, je pensais qu'il serait logique de faire quelque chose comme :
class Person
scope :grouped_counts, group(:name).count
end
Mais cela ne fonctionne pas. J'obtiens cette erreur :
ArgumentError: Unknown key(s): communicating, failed, matched, unmatched
from /Users/bradrobertson/.rvm/gems/ruby-1.9.2-p180@influitive/gems/activesupport-3.0.5/lib/active_support/core_ext/hash/keys.rb:43:in `assert_valid_keys'
from /Users/bradrobertson/.rvm/gems/ruby-1.9.2-p180@influitive/gems/activerecord-3.0.5/lib/active_record/relation/spawn_methods.rb:110:in `apply_finder_options'
from /Users/bradrobertson/.rvm/gems/ruby-1.9.2-p180@influitive/gems/activerecord-3.0.5/lib/active_record/named_scope.rb:110:in `block in scope'
from (irb):48
from /Users/bradrobertson/.rvm/gems/ruby-1.9.2-p180@influitive/gems/railties-3.0.5/lib/rails/commands/console.rb:44:in `start'
from /Users/bradrobertson/.rvm/gems/ruby-1.9.2-p180@influitive/gems/railties-3.0.5/lib/rails/commands/console.rb:8:in `start'
from /Users/bradrobertson/.rvm/gems/ruby-1.9.2-p180@influitive/gems/railties-3.0.5/lib/rails/commands.rb:23:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'
r
Il fonctionne cependant comme une méthode de classe
def self.grouped_counts
group(:name).count
end
J'aimerais savoir ce que les gens pensent de l'utilisation des scopes et des méthodes de classe. Ai-je raison de supposer qu'un scope doit toujours retourner une relation, alors qu'une méthode de classe peut retourner ce qu'elle veut ?