RoR:first_or_initialize块不保存

时间:2013-08-23 17:42:46

标签: ruby-on-rails activemodel

我有以下代码,它可以正常工作但没有错误,但模型永远不会被保存...

myarray.each do |item|

    r = MyModel.unscoped.where(:site_id => @site.id, :url => item['permalink_url']).first_or_initialize do |r|
        r.title              = 'asdasdadaddjfgnfd'
        r.save!
    end
end

终端在尝试查找模型时显示SQL SELECT语句,但UPDATE / INSERT语句永远不会运行。

我在这里缺少什么?

3 个答案:

答案 0 :(得分:7)

Rails first_or_*方法只为initializecreate部分调用传递的块。如果找到记录,方法只返回它,所以传递块永远不会运行。 Check the source

因此,您只能在first_or_*方法中使用块来初始化新项目,而不是更新现有项目。最有可能的是,存在这种情况的记录并且不会更新。

尝试移动更新代码,例如

myarray.each do |item|

  r = MyModel.unscoped.where(:site_id => @site.id, :url => item['permalink_url']).first_or_initialize
  r.title              = 'asdasdadaddjfgnfd'
  r.save!

end

答案 1 :(得分:6)

我通过使用:

解决了这个问题

.first_or_initialize.tap() do |r|

但下面的评论也是相关的

答案 2 :(得分:3)

您正在寻找first_or_createfirst_or_initialize只是初始化对象(可能是准备保存,但不一定是这样)。

您现有的代码可能会如下工作:

r = MyModel.unscoped.where(:site_id => @site.id, :url => item['permalink_url']).first_or_initialize do |r|
    r.title              = 'asdasdadaddjfgnfd'
end

r.save!