【问题标题】:ActiveRecord is showing wrong column defaultsActiveRecord 显示错误的列默认值
【发布时间】:2012-12-09 03:00:57
【问题描述】:

这是我第一次在非 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}

我之前曾为 Rails 应用程序使用过 ActiveRecord,它足够聪明,可以找出默认值。由于某种原因,它现在无法弄清楚它们。

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


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

【问题讨论】:

    标签: ruby database activerecord sqlite column-defaults


    【解决方案1】:

    尝试这样做:

    class Account < ActiveRecord::Base
      after_initialize :default_values
    
      private
        def default_values
          self.username ||= "default value"
          #etc...
        end
    end
    

    【讨论】:

    • 既然id 列是autoincrement,有没有办法获取数据库将使用的下一个id?通常,它会不断增加 id,因此如果最后一项的 id 为 12,而您将其删除,则下一项的 id 将为 13。
    • 不,该值在插入数据库后返回给 ActiveRecord。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多