翻译 ApplicationRecord in Rails 5

dothide · 2016年08月03日 · 最后由 lucifer 回复于 2016年08月05日 · 6006 次阅读

这篇博客是我们 《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 4 迁移

所有新的 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

标题里面不用加 [翻译],都选了节点的

一直的做法是定义一个 BaseRecord 继承 ActiveRecord 的

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