1

我有一个简单的 Rails Web 服务,它公开了一个允许客户端发布新记录的 JSON API。POST 处理时,首先会创建引用的记录,同时也会更新一些相关的记录。

@foo = Foo.new(foo_params)
if @foo.save
    related_list = Foo.where(:some_id => foo_params[:list])
    related_list.each do |related|
        # <figure out some stuff here>
        related.update_attributes(stuff)
    end

    # debug spew
    @test = Foo.find(a_related_record_id)
    puts @test.as_json

    format.json { render json: @foo.as_json }
end

我认识到这是一个糟糕的两阶段提交模式,它滥用了典型的 REST 模型,但我继承了这段代码。我最终会修复它;这都是分阶段“修复”计划的一部分。

此代码在本地测试盒上完美运行。当部署到 Heroku 时,我进行了调试,显示模型在调用 update_attributes 后显然正在更新。但是,不知何故,模型实际上并没有更新。当我之后使用网页检查“相关”记录时,它们都没有通过“东西”更改进行更新。我对此感到非常困惑,因为调试喷出似乎显示正在更新的记录。有什么见解吗?

更新

当我回顾调试时,我刚刚注意到的一件事是 updated_at 日期时间永远不会改变,即使记录中的字段似乎有。您可以从下面的行中看到,该呼叫是在 UTC 时间 8:04:15 左右进行的。此外,我验证了 update_attributes 返回 true,所以据我所知没有错误。

在调用 update_attributes 之前:

←[36m2012-09-20T08:04:15+00:00 app[web.1]:←[0m { "created_at"=>Thu, 20 Sep 2012 00:43:45 UTC +00:00, "somefield" =>"" , "id"=>2, "updated_at"=>2012 年 9 月 20 日星期四 06:22:07 UTC +00:00 }

调用 update_attributes 后:

←[36m2012-09-20T08:04:15+00:00 app[web.1]:←[0m { "created_at"=>Thu, 20 Sep 2012 00:43:45 UTC +00:00, "somefield" =>"10000848364" , "id"=>2, "updated_at"=>2012 年 9 月 20 日星期四 06:22:07 UTC +00:00 }

4

2 回答 2

0

经过大量艰苦的研究,我设法找出了问题的根源和修复方法,但我不清楚为什么会这样。不过,它现在正在解除对我的阻止,这就足够了。

在上面的代码中,在

# <figure out some stuff here> 

堵塞。我在原始问题中抽象出了一些代码,因为我认为它不相关。原来是这样。具体来说,有一行我在进行字符串连接:

some_string << @foo.somestringfield

这一行,由于某种原因,导致

related.update_attributes(stuff) 

不保存到数据库。这是 100% 可重现的(相信我,我测试了大约 10 次以确定)。修复很简单:

some_string = some_string + @foo.somestringfield

说真的,这解决了问题。我没有深入调试 ruby​​ 中的就地串联以确定根本原因,但如果其他人遇到这个问题,那么,现在你知道了。

于 2012-09-22T04:47:41.553 回答
0

看起来一般这种行为(update_attributes保存在本地但不在 Heroku 上)可以通过确保您没有在调用update_attributes.

对我来说,呼叫update_attributes(:heartbeat => Time.now)在本地工作,但未能在 Heroku 上保存。使用上面的答案,我猜测并通过Time.now在调用 update_attributes 之前保存到变量来解决问题:

heartbeat = Time.now
thing.update_attributes(:heartbeat => heartbeat)

此代码正确保存在 Heroku 上。这应该是评论,但由于声誉规则,我正在“回答”。

于 2016-03-31T15:40:12.710 回答