当调用“ActiveRecord :: Base.create”时,如何调用“create”?

时间:2016-03-17 12:50:09

标签: ruby-on-rails

在Rails中,我创建了新表。

PersID DeptID Date       Comment      Weighting
101    222    01.02.2016 Hello World  0,8

然后我创建新记录。致电class Post < ActiveRecord::Base end 时,Post.createcreate中定义的方法。

persistance.rb

Post.method(:create).source_location => #["D:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/activerecord-4.2.5.2/lib/active_record/persistence.rb", 29] Base中的同一目录中定义。

假设看到文件,模块base.rb和类PersistanceBase中的文件相同。

那么ActiveRecord如何调用Post

2 个答案:

答案 0 :(得分:3)

您需要将经典的层次继承和并行继承分开。

在Ruby类中,只能从单个类继承,但它们可以包含许多模块。这就是通常所说的其他语言的mixins或traits。

module A
  def hello(name = "World")
    "Hello #{name}"
  end
end

module B
  def goodbye(name = "World"))
    "Goodbye #{name}"
  end
end

class Base
  include A
  include B
end

class Foo < Base
end

foo = Foo.new
puts foo.hello # => Hello World
puts foo.goodbye # => Goodbye World

在这种情况下,ActiveRecord::Base包含许多提供其功能的ActiveRecord::Persistence模块。

您还混淆了命名空间和继承的概念。 Ruby没有实际的命名空间(有自己的关键字),但你可以通过将它们放在一个模块中来封装大多数类型的对象:

module Foo
  class Bar
  end

  module Baz
    class Bar
    end
  end
end

这不会影响继承。例如,在这种情况下,Foo::BarFoo::Baz::Bar之间没有实际连接。定义类或模块的文件与继承树的工作方式之间也没有直接关联。 Ruby很乐意让你把所有东西都推到一个文件中。

答案 1 :(得分:1)

ActiveRecord::Base包含ActiveRecord::Persistence,您可以在来源中看到:

  class Base
    # [...]

    include Core
    include Persistence
    include ReadonlyAttributes

https://github.com/rails/rails/blob/4-2-stable/activerecord/lib/active_record/base.rb#L285