【问题标题】:Why MyModel.all works in Rails?为什么 MyModel.all 在 Rails 中有效?
【发布时间】:2011-02-23 03:31:26
【问题描述】:

我不明白这个小东西:

假设,我们有“条件”模型

class Condition < ActiveRecord::Base
end

为什么 Condition.all 有效?

Condition.all.each { |p| do_something }

这个语法告诉我们,我们在某处实例化了“条件”类对象?

或者它是配置案例的一些约定?

我问这个,因为我想重写 Condition.all 方法来返回条件,按“created_at”字段值排序?

我不需要使用排序方法,我想插入条件,因为在整个项目中我只需要一个排序

谢谢

【问题讨论】:

    标签: ruby-on-rails model methods


    【解决方案1】:

    Person.all 只是Person.find(:all) 的别名(请参阅文档here)。

    allfind 一样,是ActiveRecord::Base 上的类方法,因此不需要实例即可调用。

    更新

    要覆盖类方法,您需要记住 self. 前缀。例如你可以像这样覆盖all

    class Condition < ActiveRecord::Base
      def self.all(*args)
        # overridden implementation here
      end
    end
    

    如果您不清楚实例方法与类方法,请阅读this blog post,这是一个很好的总结,

    但是,如果您只想指定默认排序,不需要这样做。你可以用default_scope:

    class Condition < ActiveRecord::Base
      default_scope :order => 'created_at'
    end
    

    【讨论】:

    • 我将 Person 更改为 Condition 以更好地反映我现在在帖子中添加的内容。但是,关于“.all”——为什么我们不写“Conditions::all”。 Condition - 是否已经实例化了类对象?
    • 好的,当它不需要实例才能被调用时,为什么我们像实例一样调用“all”?为什么不是 "::all" ?
    • 条件一个实例。它是 Class 对象的一个​​实例。但是不要太拘泥于这种区别,只需了解您可以拥有与实例级方法分开的类级方法
    • 是的,你可以调用 Condition::all 并且它应该完全一样的工作
    猜你喜欢
    • 2011-09-06
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    相关资源
    最近更新 更多