ActiveRecord Rails 3 champ d'application vs méthode de classe

Je suis de nouveau à la nouvelle interface de requête de ActiveRecord, donc je suis encore de comprendre les choses.

J'espérais que quelqu'un pourrait expliquer la différence entre l'utilisation d'un scope dans un ActiveRecord modèle et simplement à l'aide d'une méthode de classe (c'est à dire self.some_method)

De ce que j'ai pu rassembler, un champ d'application devrait toujours retourner une relation, alors qu'une méthode de classe ne doit pas nécessairement. Est-ce vrai?

Par exemple, j'ai pensé qu'il serait judicieux 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 ne fait toutefois travailler en tant que méthode de classe

def self.grouped_counts
  group(:name).count
end

Je suis intéressé de savoir des peuples pensées sur le moment d'utiliser des étendues et quand utiliser les méthodes de la classe. Suis-je raison de supposer qu'un champ doit toujours retourner une relation, mais une méthode de classe peut retourner ce qu'il veut?

InformationsquelleAutor brad | 2011-05-05