Rails update_attributes尝试插入id列

时间:2013-01-09 19:33:04

标签: sql ruby-on-rails insert primary-key rails-activerecord

我有一个模特:

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)

显示其他事物的架构:

  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

这没有显示出主要的主要约束(或缺乏),这是潜在的问题。

2 个答案:

答案 0 :(得分:1)

这是由于某种方式丢失了other_things表上的主键规范。我确定了这一点,因为我不得不将实例(分期和生产)分开,而不是另一个实例。在比较代码和Rails相关问题之后,我决定对数据库模式进行区分,这显示了缺少的主键约束。显然,Rails使用主键来识别正确的列;直觉上显而易见,但如果你不认识我,那就不行了。感谢您的评论!

ALTER TABLE ONLY other_things ADD CONSTRAINT other_things_pkey PRIMARY KEY (id);

答案 1 :(得分:0)

有类似的问题我通过使用update_columns而不是update_attributes解决了。希望它会帮助某人。 :)