保存时出错! Rails 3.1.0-rc6中的方法

时间:2011-08-23 10:42:40

标签: sql ruby-on-rails activerecord

不知道我做错了什么...... 有这个代码:

new_model = Model.new(:brand_id=>brand_id, :name=>new_model_name)
new_model.save!
ModelImage.upload(new_model.id, params[:images])

但是new_model.id等于nil。 WTF?

在rails c中尝试过,没有错误。 SQl没问题。

THX。

Rails控制台中的一些代码:

irb(main):045:0> h = Model.create(:brand_id=>2, :name=>'SKyFy')
SQL (0.1ms)  BEGIN
SQL (42.2ms)  INSERT INTO `models` (`brand_id`, `id`, `name`) VALUES (?, ?, ?)     [["brand_id", 2], ["id", nil], ["name", "SKyFy"]]
(118.7ms)  COMMIT
=> #<Model id: nil, brand_id: 2, name: "SKyFy">
irb(main):046:0> h.id
=> nil

没有任何attr_ *,验证。模型很清楚。

另一个例子:

irb(main):048:0> h = Model.new(:brand_id=>1, :name=>'SKYDOS')
=> #<Model id: nil, brand_id: 1, name: "SKYDOS">
irb(main):049:0> h.save!
SQL (0.2ms)  BEGIN
SQL (3.4ms)  INSERT INTO `models` (`brand_id`, `id`, `name`) VALUES (?, ?, ?)  [["brand_id", 1], ["id", nil], ["name", "SKYDOS"]]
(83.5ms)  COMMIT
=> true
irb(main):050:0> h.id
=> nil
irb(main):051:0> h.errors
=> #<ActiveModel::Errors:0x9a37c18 @base=#<Model id: nil, brand_id: 1, name: "SKYDOS">,     @messages={}>
irb(main):052:0> 

PS 解决了我的问题 ...有两个主键。 感谢所有人。

3 个答案:

答案 0 :(得分:2)

很难用如此少的信息说出来,但答案很可能在于你对new_model的验证。

查看new_model.rb,看看是否有任何可能失败的验证。

如果没有,请查看您是否发生attr_accessible / attr_protected冲突。

为了帮助您快速找到答案,请添加以下行:

logger.debug new_model.errors

save!之后,您会看到日志中发生了什么。

答案 1 :(得分:2)

config.active_record.schema_format = :sql

在config / application.rb

这应该有希望解决你的问题。

请注意查询,

INSERT INTO `models` (`brand_id`, `id`, `name`) VALUES (?, ?, ?)  [["brand_id", 1], ["id", nil], ["name", "SKYDOS"]

此查询错误,Rails不知道表的主键,并假设(错误地)该id只是一个普通列。使用SQL模式格式 - 这应该可以正常工作。

您可以通过查看db / schema.rb来确认这一点,最终会得到类似的结果:

create_table "foos", :id => false, :force => true do |t|
  t.integer  "id",                                 :null => false
  ...
end

答案 2 :(得分:1)

确保您在模型表中使用 auto_increment 来获得主键'id'。