新手问题 Rails 中的抽象类 (abstract_class) 到底是什么意思?

rennyallen · 2017年01月11日 · 最后由 pathbox 回复于 2017年01月14日 · 4646 次阅读

发现每个 Rails 项目中默认都有这么一句:self.abstract_class = true,这貌似是rails 5 新增加的东西

# app/models/application_record.rb
class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
end

搜了一下,有用的信息不多:

“子类继承的时候不能继承父类的隐式属性”
“只对你自己的程序起作用,从而不会污染其他插件”
"setting self.abstract_class = true meant that your model did not have a table backing it."

新手看得迷迷糊糊,求解:

  1. self.abstract_class = true这句是什么意思?为什么要把 self.abstract_class 设置为 true?可以举个例子吗;

  2. 是不是设置了这个抽象类我就可以创建一个数据库里没有这个表的 AR model 了?如果是的话,那这样做有什么意义?AR 不就是要把对象映射到数据库中对应的表吗,所以又回到了第一个问题。

当你有几个子类要继承同一个父类,但是并不是 STI 的时候,在父类声明 abstract_class,在子类声明各自的 table_name http://api.rubyonrails.org/classes/ActiveRecord/Inheritance/ClassMethods.html

ApplicationRecord 就是个 abstract class,他是 ActiveRecord::Base 和你的实际 model 中间的一层,使你对 ApplicationRecord 的扩展不会影响 ActiveRecord::Base。而要做到这个,常规情况你需要有个名为 application_records 的表。

@hiveer STI = Single Table Inheritance 单表继承

需要 登录 后方可回复, 如果你还没有账号请 注册新账号