1

私はモデルを持っています:

class MyModel < ActiveRecord::Base
  has_many :other_things
  accepts_nested_attributes_for :other_things
  attr_accessible :other_things_attributes
end

class OtherThing < ActiveRecord::Base
  belongs_to :my_model
  attr_accessible :foo
end

MyModel インスタンスで update_attributes を実行しようとすると、Rails/ActiveRecord は id 列に null を挿入しようとします:

my_instance = MyModel.first
my_instance.update_attributes({
  "other_things_attributes"=> {
    "1357758179583" => {"foo"=>"bar", "_destroy"=>"false"},
    "1357758184445" => {"foo"=>"thing", "_destroy"=>"false"}
  }
})

それは失敗し、次のようになります。

  SQL (0.5ms)  INSERT INTO "other_things" ("created_at", "my_model_id", "id", "updated_at", "foo") VALUES ($1, $2, $3, $4, $5)  [["created_at", Wed, 09 Jan 2013 14:30:33 EST -05:00], ["my_model_id", 8761], ["id", nil], ["updated_at", Wed, 09 Jan 2013 14:30:33 EST -05:00], ["foo", "bar"]]
   (0.1ms)  ROLLBACK 
ActiveRecord::StatementInvalid: PGError: ERROR:  null value in column "id" violates not-null constraint
: INSERT INTO "other_things" ("created_at", "my_model_id", "id", "updated_at", "foo") VALUES ($1, $2, $3, $4, $5)

other_things を示すスキーマ:

  create_table "other_things", :force => true do |t|
    t.string   "foo"
    t.integer  "my_model_id"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end

これが示していないのは、根本的な問題であった主キー制約 (またはその欠如) です。

4

2 に答える 2

1

これは、other_things テーブルの主キーの仕様が何らかの形で失われたことが原因でした。これを決定したのは、インスタンス (ステージングと本番) を分離する必要があり、一方では機能し、他方では機能しなかったためです。コードと Rails 関連の問題を比較した後、DB スキーマを比較することにしました。これにより、主キー制約が欠落していることがわかりました。明らかに、Rails は主キーを使用して適切な列を識別します。直感的に明らかですが、私の意見では、まだ知らない場合はそうではありません。コメントありがとうございます!

ALTER TABLE ONLY other_things ADD CONSTRAINT other_things_pkey PRIMARY KEY (id);
于 2013-01-09T20:17:38.463 に答える
0

update_attributes の代わりに update_columns を使用して解決した同様の問題がありました。それが誰かを助けることを願っています。:)

于 2014-07-29T13:42:36.583 に答える