在Rails中,我创建了新表。
PersID DeptID Date Comment Weighting
101 222 01.02.2016 Hello World 0,8
然后我创建新记录。致电class Post < ActiveRecord::Base
end
时,Post.create
是create
中定义的方法。
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
和类Persistance
与Base
中的文件相同。
那么ActiveRecord
如何调用Post
?
答案 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::Bar
和Foo::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