ActiveRecord显示错误的列默认值

时间:2012-12-09 03:00:57

标签: ruby database activerecord sqlite column-defaults

这是我第一次在非rails应用程序中使用ActiveRecord,而且我遇到了一个问题。 ActiveRecord能够找出我在sqlite3数据库中的列,但由于某种原因它无法找出默认的列值。

以下是相关表格的sql描述。

-- Describe ACCOUNTS
CREATE TABLE "accounts" (
    "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL DEFAULT (0),
    "username" TEXT NOT NULL,
    "password_hash" BLOB NOT NULL,
    "creation_time" INTEGER NOT NULL DEFAULT(strftime('%s', 'now')),
    "expiration_time" INTEGER NOT NULL DEFAULT(strftime('%s', 'now') + 2592000)
)

我使用以下代码加载我的数据库文件。

require 'active_record'
require './config.rb'

ActiveRecord::Base.establish_connection(
  :adapter  => 'sqlite3',
  :database => DB_FILE
)

class Account < ActiveRecord::Base
end

当我使用REPL查看Account表的列默认值时,这就是我得到的:

[10] pry(main)> Account.column_defaults
=> {"id"=>0,
 "username"=>nil,
 "password_hash"=>nil,
 "creation_time"=>0,
 "expiration_time"=>0}

之前我曾使用ActiveRecord作为rails应用程序,它足够聪明,可以找出默认值。出于某种原因,它现在无法解决它们。

我在这里做错了吗?我读到我可以用default :id => bla手动指定默认值,但ActiveRecord不应该能够找出默认值吗?


更新:我想我想出了一个解决方法。 Account.column_defaults返回的哈希值是可写的,更改这些元素似乎工作正常。

1 个答案:

答案 0 :(得分:1)

尝试这样做:

class Account < ActiveRecord::Base
  after_initialize :default_values

  private
    def default_values
      self.username ||= "default value"
      #etc...
    end
end