【问题标题】:Rails 4.1 with pg 0.17.1 -- can't modify fields in model instance带有 pg 0.17.1 的 Rails 4.1 - 无法修改模型实例中的字段
【发布时间】:2014-10-05 04:42:34
【问题描述】:

我正在使用带有 postgres 后端的 rails 4.1 工作,由 'pg' gem (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,因为它是很多无用的文本,并且忘记编辑一个匹配项。固定。

我还忘了提到我使用的是非标准主键。在我的小部件模型中,我有

self.primary_key = "randID"

Widgets 仍然有一个普通的 'id' 字段,但它只能通过 Widget['id'] 访问(因为 Widget.id 现在返回 randID)。我在选择小部件时没有遇到任何问题。

【问题讨论】:

  • 为什么id 会发生变化?您正在寻找'14b13b1e',但得到'14b13b1e4db5c9cb58bdb26157bee89be6ae494a'。你的Widget 班级是什么样的?
  • 对不起;编辑问题以澄清:我只是删除了一些字符串以简化问题,并忘记剪辑最后一次出现。固定!

标签: ruby-on-rails ruby postgresql


【解决方案1】:

叹息。这完全是我的错。这是我的模型文件widget.rb的摘录

class Widget < ActiveRecord::Base
    self.primary_key = "randID"
    before_save :set_randID
    belongs_to :user

    ...
end

我正在运行一个函数来在保存之前计算主键 (set_randID)(而不是像我应该做的那样只计算一次 before_create)。当我尝试更新模型的实例时,保存会尝试重新计算并设置实例对象的主键。

这似乎一直默默地失败了。 SQL 查询看起来返回“true”,并且 ActiveRecord 对象有一个空的错误哈希。

所以,问题已解决;完全是我的错,很抱歉浪费了你的时间……但是有没有人知道我在哪里可以早点注意到这一点?

【讨论】:

  • 如果您包含您的模型代码(或至少其中的关系和回调设置部分),有人可能会注意到您的before_save
猜你喜欢
  • 2014-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-12
  • 1970-01-01
相关资源
最近更新 更多