RoR:first_or_initialize块不保存

Ash*_*ley 2 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
Run Code Online (Sandbox Code Playgroud)

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

我在这里错过了什么?

dim*_*uch 7

Rails first_or_*方法仅为部分initializecreate部分调用传递的块.如果找到记录,方法只返回它,所以传递块永远不会运行.检查来源

因此,您只能在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
Run Code Online (Sandbox Code Playgroud)


Ash*_*ley 6

我通过使用以下方法解决了

.first_or_initialize.tap() do |r|

但下面的评论也很重要


d_e*_*ier 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!
Run Code Online (Sandbox Code Playgroud)