这篇博客是我们 《Rails 5 系列文章》 中的一篇
Rails 5 beta-1 最近被正式发布,其中有一项可圈可点的变化叫做 「ApplicationRecord」 。
直至 Rails 4.2 所有的 model 均继承自 ActiveRecord::Base
,但从 Rails 5 起,它们将继承自 ApplicationRecord
。
class Post < ApplicationRecord
end
那 ActiveRecord
发生了什么(变化)?
其实改变并不大,以下文件将被自动加入到 Rails 5 项目的 model 中去。
# app/models/application_record.rb
class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true
end
这招跟原先继承自 ActiveController::Base
的 controller 替换为继承自 ApplicationController
很类似。
如今的 ApplicationRecord
将成为一个应用所需的所有自定义和扩展的单一入口,从而替代对 ActiveRecord::Base
的猴子补丁。
假如我需要对 ActiveRecord
增加一些额外的功能,以下是在 Rails 4.2 中的做法:
module MyAwesomeFeature
def do_something_great
puts "Doing something complex stuff!!"
end
end
ActiveRecord::Base.include(MyAwesomeFeature)
而现在(如果还这么做),ActiveRecord::Base
将永久的包含 MyAwesomeFeature
并且所有继承自它的子类都将包含 MyAwesomeFeature
,即便并非所有子类都需要。
尤其是假如你正在使用的插件或引擎来自被打过猴子补丁的 ActiveRecord::Base
则会被泄漏到插件和引擎的代码中去。
但如果使用 ApplicationRecord
,它们将被本地化应用到哪些继承自 ApplicationRecord
的 model 中去,也就是说只对你自己的程序起作用。(从而不会污染其他插件)
class ApplicationRecord < ActiveRecord::Base
include MyAwesomeFeature
self.abstract_class = true
end
所有新的 Rails 5 项目都默认会有 application_record.rb
。如果你正从 Rails 4 做迁移,那只需创建如下文件至 app/models/application_record.rb
,再将所有 model 的继承父类从 ActiveRecord::Base
改为 ApplicationRecord
即可
# app/models/application_record.rb
class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true
end
作者 Prathamesh Sonpatki 于 2015.11.28