ruby-on-rails-3 - ActiveRecord Rails 3 范围与类方法

标签 ruby-on-rails-3 activerecord class-method scopes

我对 ActiveRecord 的新查询界面不熟悉,所以我仍在弄清楚。

我希望有人能够解释在 ActiveRecord 模型中使用 scope 和仅使用类方法(即 self.some_method)之间的区别

据我所知,作用域总是期望返回关系,而类方法不一定必须返回关系。这是真的吗?

例如,我认为这样做是有意义的:

class Person
  scope :grouped_counts, group(:name).count
end

但这行不通。我收到此错误:

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

但是它确实可以作为类方法使用

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

我有兴趣了解人们对何时使用作用域以及何时使用类方法的想法。我是否正确地假设范围必须始终返回关系,但类方法可以返回它想要的任何内容?

最佳答案

Rails 2.x 中存在更多差异,因为named_scopes 不执行您的查询(因此您可以链接它们),而类方法通常会执行查询(因此您无法链接它们),除非您手动将您的查询包装在 scoped(...) 调用中。

在 Rails 3 中,一切都会返回 ActiveRecord::Relation 直到您需要实际结果,因此作用域可以与类方法链接起来,反之亦然(只要类方法返回 ActiveRecord::Relation 对象,而不是其他对象类型(如计数)。

通常,我使用 scope 条目作为简单的单行语句来过滤结果集。然而,如果我在“范围”中做任何复杂的事情,可能需要详细的逻辑、lambda、多行等,我更喜欢使用类方法。正如您所发现的,如果我需要返回计数或类似的内容,我会使用类方法。

关于ruby-on-rails-3 - ActiveRecord Rails 3 范围与类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5899765/

相关文章:

ruby - 将用户从 Active Directory 加载到 Rails 3.1 Active Record 数据库

ruby-on-rails - 在 ActiveRecord 查询中包含相关数据的计算

mysql - 针对匹配错误的 codeigniter 事件记录

ruby-on-rails - 未定义的方法 `spec' #<ActiveRecord::ConnectionAdapters::NullPool:0x00007fd44f8ab300> - Rails 6 schema:load

JavaScript:利用 setInterval() 调用类方法

python - 创建 Python 类方法

java - 方法不互相引用

ruby-on-rails - 使用 CanCan 授权命名空间和嵌套 Controller

ruby-on-rails-3 - 测试电子邮件在 cucumber 中发送

ruby-on-rails - Rails 3 response_with自定义模板