4

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

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 语句从未运行。

我在这里想念什么?

4

3 回答 3

8

Rails方法只为或部分first_or_*调用传递的块。如果找到记录,则方法将返回它,因此传递的块将永远不会运行。检查来源initializecreate

因此,您只能使用 block infirst_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
于 2013-08-23T18:18:14.160 回答
6

我通过使用解决了这个问题:

.first_or_initialize.tap() do |r|

但下面的评论也是相关的

于 2013-08-24T11:06:34.903 回答
3

你正在寻找first_or_create. first_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!
于 2013-08-23T17:45:10.173 回答