Rails中类的初始化方法在哪里?

时间:2016-06-06 13:44:20

标签: ruby-on-rails ruby

在Rails中创建的类的initialize方法在哪里?

例如,我可以使用以下代码创建一个新类。

rails g model User
rake db:migrate

现在我有/models/user.rbUser类。

class User < ActiveRecord::Base
end

但是从研究Ruby开始,我认为所有类都需要使用initialize方法进行初始化。

class User
    def initialize()
    end
end

但是我从未在Rails中看到过这种情况。 Rails如何解决这个问题?

(目前正在使用Rails 4。)

3 个答案:

答案 0 :(得分:5)

该类继承自ActiveRecord::Basehttps://github.com/rails/rails/blob/master/activerecord/lib/active_record/base.rb

此课程包含大量其他文件。包括一个名为core的模块,它定义了初始化。

https://github.com/rails/rails/blob/master/activerecord/lib/active_record/core.rb#L312

所以它确实拥有它,但它被隐藏起来。

答案 1 :(得分:2)

构造函数派生自模块ActiveRecord Base class。

有关initializer

的文档
  

构造函数详细信息

permalink #initialize(attributes = nil) ⇒ Base

  

可以将新对象实例化为空(传递无构造参数)或使用属性预先设置但尚未保存(传递具有与关联表列名匹配的键名的哈希)。在这两种情况下,有效的属性键由关联表的列名确定 - 因此您不能拥有不属于表列的属性。

答案 2 :(得分:2)

  

但是从研究Ruby开始,我认为所有类都需要initialized和初始化方法。

您不必定义initialize方法。这是一个非常有效的Ruby类:

class Foo
end

当然,我可以创建实例:

foo = Foo.new
#=> #<Foo:0x007fa814243ad8>

Foo确实有initialize方法,它继承自BasicObject

Foo.instance_method(:initialize)
#=> #<UnboundMethod: Foo(BasicObject)#initialize>

默认的实现不做任何事,它是一个返回nil的空方法。