我有以下代码,它可以正常工作但没有错误,但模型永远不会被保存...
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语句永远不会运行。
我在这里缺少什么?
答案 0 :(得分:7)
Rails first_or_*
方法只为initialize
或create
部分调用传递的块。如果找到记录,方法只返回它,所以传递块永远不会运行。 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_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!