我在rails 4.1中使用postgres后端工作,由' pg'宝石(0.17.1)。当我尝试更新并保存一些普通的整数/字符串字段时,更改似乎成功但不会写入数据库。任何地方都没有错误(我已经找到了)。
可以在下面找到模式摘录:
enable_extension "plpgsql"
create_table "widgets", force: true do |t|
t.string "id"
t.integer "recipient"
t.datetime "receivedAt"
end
在rails控制台中:
w = Widget.find('14b13b1e')
=> #<Widget id: "14b13b1e", receivedAt: nil, created_at: "2014-10-04 17:10:39", updated_at: "2014-10-04 17:10:39">
w.receivedAt = Time.now()
=> 2014-10-04 19:39:33 +0100
w.save()
=> # database commit runs and returns 'true'
Widget.find('14b13b1e')
=> #<Widget id: "14b13b1e", receivedAt: nil, created_at: "2014-10-04 17:10:39", updated_at: "2014-10-04 17:10:39">
我也尝试过使用Widget.update,Widget.update_attribute()和Widget.receivedAt_will_change!()。在每种情况下,我得到相同的结果。没有错误可以看到:
w.errors.messages
=> {}
我尝试更改的所有字段都会发生这种情况。
我还能在哪里找到错误?
编辑:对不起,我编辑了randID,因为它是很多无用的文本,忘了编辑一个事件。固定的。
我也忘了提到我使用的是非标准主键。在我的Widgets模型中,我有
self.primary_key = "randID"
窗口小部件仍然有正常的ID&#39;字段,但它只能通过Widget [&#39; id&#39;]访问(因为Widget.id现在返回randID)。我在选择Widgets方面没有任何问题。
答案 0 :(得分:0)
叹息。这完全是我的错。这是我的模型文件widget.rb
的摘录class Widget < ActiveRecord::Base
self.primary_key = "randID"
before_save :set_randID
belongs_to :user
...
end
我正在运行一个函数来计算主键(set_randID)BEFORE SAVE(而不只是一次before_create,就像我应该做的那样)。当我尝试更新模型的实例时,save会尝试重新计算并在实例对象上设置主键。
这似乎在堆栈中一直无声地失败。 SQL查询看起来像是返回“true”,而ActiveRecord对象有一个空错误哈希。
所以,问题是固定的;完全是我的错,抱歉浪费你的时间......但有没有人知道我可以提前注意到这一点?