Rails 4.1 with pg 0.17.1 - 无法修改模型实例中的字段

时间:2014-10-04 18:53:32

标签: ruby-on-rails ruby postgresql

我在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方面没有任何问题。

1 个答案:

答案 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对象有一个空错误哈希。

所以,问题是固定的;完全是我的错,抱歉浪费你的时间......但有没有人知道我可以提前注意到这一点?