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

rennyallen · 发布于 2017年1月11日 · 最后由 pathbox 回复于 2017年1月14日 · 628 次阅读
26688

发现每个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不就是要把对象映射到数据库中对应的表吗,所以又回到了第一个问题。

共收到 5 条回复
23529

当你有几个子类要继承同一个父类,但是并不是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的表。

6829

#1楼 @mizuhashi 什么是STI?

26688

@hiveer STI = Single Table Inheritance 单表继承

15420

#1楼 @mizuhashi 水桥 正解

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