gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 06:04:55 26 4
gpt4 key购买 nike

我对 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com