2013-02-23 65 views
1

我有一个执行after_save的轨model.save返回true,但不保存到数据库

一些行动,在这一功能,我有以下代码

progression = Progression.find_by_id(newprogression) 
if progression.participation_id.nil? 
    progression.participation_id = participation.id 
    progression.save 
else 

我所看到的模型内的一个函数是进展没有被更新。尽管下面

  • 如果之前保存它已被更新
  • 如果调试器我手动运行progression.save我得到真正的回到我检查progression.participation_id。

有什么想法?

+0

不应该。也许验证失败。但他们也应该手动保存失败。所以不确定。 – Arindam 2013-02-23 17:07:19

回答

0

尝试

progression = Progression.find_by_id(newprogression) 
if progression.participation_id.nil? 
    progression.update_attributes(
    :participation_id => participation.id 
) 
else 
+1

没有,也没有工作。感谢思想,虽然 – 2013-03-04 12:44:15

+0

update_attributes后,你不必使用'保存' – user2503775 2013-08-13 13:43:25

+0

感谢您的更正。更新了答案。 – kobaltz 2013-08-13 15:25:37

0

这可能是一个缓存的问题。从rails guide on AR Relations - Sec 3.1开始,您可能希望通过传递true来重新加载缓存。如果您通过参与进行检查,则可能会遇到此问题,然后通过进展建立链接。

假设进展belongs_to的参与,

你可以尝试:progression.participation =参与,然后progression.save

另外,尝试:participation.progressions < <进展和participation.save?

+0

是啊,已经这样做了,到目前为止没有运气 – 2013-03-04 12:43:47

1

我还是很新的Rails,但每次我保存的东西,我必须使用爆炸的方法。您是否尝试过progression.save!

+0

是的,试过了,没有骰子 – 2013-08-14 16:20:04

+0

我能想到的最后一件事就是如果你使用关系(如果你使用的是关系,就使用'progression.participation = participation'与命名) – Goldentoa11 2013-08-14 17:32:33

0

saveafter_save在同一个事务中运行。也许这是一个问题。尝试使用after_commit回调

+0

感谢您的回应,行动实际上是针对不同的模式比after_save指的是,所以我不确定这适用?尽管如此,请尝试一下 – 2013-08-14 16:19:36

0

好的,我有同样的问题,我设法处理它。 问题在于关联名称。我有一个名为User的模型和一个名为Update的子模型,其中每个用户都有一些新的更新。所以,在user.rb我有这条线:

has_one :update 

当我删除这一行后,一切再次开始工作。看起来这是一个rails保留名称,创建模型时不应使用它。也许你在这里有一些类似的问题。很遗憾,Rails没有指出这个问题。