如何成功继承ActiveRecord :: Base?

时间:2014-06-08 17:56:03

标签: ruby-on-rails ruby inheritance activerecord devise

如何成功继承ActiveRecord :: Base?

环境:Ruby 2.0.0,Rails 4.0.3,Windows 8.1,PostreSQL 9.3.3,Devise 3.2.4

我有一个可操作的应用程序,并希望为其添加一个全面的日志记录类。这将是一个复杂的类,它不仅记录消息,还创建一个按对象记录事务的SQL数据库。我需要在应用程序的所有类中使用此类。

为此,我想将ActiveRecord :: Base继承到类中,然后让所有其他类继承它,尽管我不打算使用STI。这在概念上似乎比在实践中简单得多,尽管我认为这种继承是一种常见的最佳实践。我错过了什么吗?

其中一个初始表是:

class Device < ActiveRecord::Base
...
end

我这样设置:

class XLog < ActiveRecord::Base
  self.abstract_class = true
  def initialize
  end
end
class Device < XLog
...
end

在此更改之前,应用程序运行正常。在此更改后,当我登录时收到:

ArgumentError at /devices/sign_in
wrong number of arguments (1 for 0)

错误发生在:

bin/rails, line 4

bin / rails是:

#!/usr/bin/env ruby.exe
APP_PATH = File.expand_path('../../config/application',  __FILE__)
require_relative '../config/boot'
require 'rails/commands'

Device是此应用程序中的Devise“User”类,当我尝试登录时发生错误。如果我将Device更改为继承ActiveRecord :: Base,则允许我登录并运行。

但是,每当我在其他类上调用“new”时,我就会收到另一个错误:

undefined method `[]' for nil:NilClass

对于这种继承,我肯定遗漏了一些东西。建议表示赞赏。

1 个答案:

答案 0 :(得分:0)

initialize方法抛出错误。每次初始化子类时都会触发它并配置为接受0参数。当我删除它,整个事情开始工作。如果我需要它,我将不得不将其配置为接受可变数量的参数并按预期传递它们,我想。