【问题标题】:what is the difference between named_scope and method?named_scope 和方法有什么区别?
【发布时间】:2012-08-05 11:50:25
【问题描述】:

named_scope 或 scope 与类方法有何区别。

named_scope :active, :conditions => {:status => 'Active'}

def self.active
  self.find(:all, :conditions => {:status => 'Active'}
end

两者有什么区别?

【问题讨论】:

  • 我是什么语言?

标签: ruby-on-rails ruby named-scope ruby-on-rails-2


【解决方案1】:

最后,“范围”将在您的模型上定义一个可链接的类方法。这就是为什么每个返回“作用域”(ActiveRecord::Relation 类的对象)的类方法都可以以与定义的作用域/命名作用域相同的方式使用。

如果您想了解更多关于范围的信息,我建议您使用 rails 控制台来玩一些输出,或者 - 也许作为开始 - 阅读 rails 指南 - 他们几乎解释了它:http://guides.rubyonrails.org/active_record_querying.html#scopes

编辑:

哦,当然,阅读 Rails 代码通常可以更快地清除问题,然后是任何人或其他任何事情。如果您在此处查看“范围”方法的定义:https://github.com/rails/rails/blob/master/activerecord/lib/active_record/scoping/named.rb#L159,您将看到它是如何定义方法的(在类级别) - 这与您自己定义方法非常相似,就像在您的示例中一样。

【讨论】:

    【解决方案2】:

    最大的区别是可链接性。假设您有另一个命名范围,很流行:

    named_scope :popular, :conditions => { :popular => true }
    

    假设您想获得受欢迎的活跃用户。所以你说User.popular.active

    named_scope :active, :conditions => {:status => 'Active'}
    

    在这种情况下,User.popular.active 有效。

    另一方面,

    def self.active
      self.find(:all, :conditions => {:status => 'Active'}
    end
    

    可能允许你说User.active.popular(取决于你的rails版本,IIRC),但绝对不是User.popular.active

    非正式地,scope 方法安排它定义的方法在对象的其他范围内可用。定义类方法则不然。

    【讨论】:

    • "可能允许你说 User.active.popular(取决于你的 Rails 版本,IIRC),但绝对不是 User.popular.active。结果不同吗?
    • 只有当你受到一个非常可怕的错误影响时,Ayrad。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 2018-05-14
    • 2010-09-14
    • 2016-05-03
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多