1

これは、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
4

2 に答える 2

3

これは少し紛らわしいです。しかし、あなたのスキーマには問題があると思います。id移行ファイルでフィールドを明示的に定義しましたか?

これは、プライマリフィールドも自動インクリメントする必要があるためです。コンピューターをチェックインしたことを確認します。テーブルの場合、私のスキーマは次のようになります。

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

ここであなたはあなたのものとの違いを見ることができます。

于 2013-03-20T19:57:06.957 に答える
1

rake db:migrate実行すると、自動インクリメントの id 列を持つモノのテーブルが作成されることがわかると思います。これは、期待どおりに機能します。テーブルを手動で作成することはお勧めしません。

于 2013-03-20T20:04:17.653 に答える