为什么在这个简单的Active Record示例中没有保存id?

时间:2013-03-20 19:46:52

标签: ruby ruby-on-rails-3 rails-activerecord

这是关于Ruby on Rails和Active Record的新手问题。我创建了一个rails应用程序,一个sqlite表和一个名为Thing的模型类来映射到表。然后我运行了rails控制台,如下所示。为什么id字段未正确保存?

irb(main):005:0> Thing.all
  Thing Load (0.2ms)  SELECT "things".* FROM "things"
=> []
irb(main):006:0> t = Thing.new :name => 'test'
=> #<Thing id: nil, name: "test", somedate: nil>
irb(main):007:0> t.id
=> nil
irb(main):009:0> t.save
   (0.2ms)  begin transaction
  SQL (3.4ms)  INSERT INTO "things" ("name", "somedate") VALUES (?, ?)  [["name", "test"], ["somedate", nil]]
   (0.8ms)  commit transaction
=> true
irb(main):010:0> Thing.all
  Thing Load (0.2ms)  SELECT "things".* FROM "things"
=> [#<Thing id: nil, name: "test", somedate: nil>]
irb(main):011:0> t.id
=> 1

在sqlite;

sqlite> .schema things
CREATE TABLE things (id int primary key, name text, somedate date);

模特:

class Thing < ActiveRecord::Base
  attr_accessible :name
end

2 个答案:

答案 0 :(得分:3)

这有点令人困惑。但我猜您的架构存在问题。您是否在迁移文件中明确定义了id字段?

我这样说是因为,主要字段也应该自动递增。为了确保我刚刚检查了我的电脑。对于表格,我的架构如下:

CREATE TABLE "albums" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "user_id" integer,......

在这里,您可以看到与您的差异。

答案 1 :(得分:1)

我想你会发现,如果你运行rake db:migrate,它会创建一个带有自动递增id列的你的东西表。哪个会按你期望的方式工作。我不建议手工创建表格。