我有一个Item类和一个Comment类。项目有很多嵌入式评论。
评论还会存储用户的用户名,因此如果用户更改了用户名,我想更新他们的所有评论。
我想做这样的事情(显然它不起作用):
Item.where('comments.username' => 'elvis33').update_all('comments.username' => 'elvis')
我该怎么做?
答案 0 :(得分:2)
$ positional operator有限制only applies to the first matched item in the query
。 Jira中存在一个关于该问题的未解决问题(如果您确实需要该功能,请投票)
因此除了检索评论集合并通过循环更新所有评论之外别无选择。
items = Item.only(:comments).where('comments.username' => 'elvis33')
items.each do |item|
item.comments.select {|com| com.username == 'elvis33'}.each do |comment|
comment.username = 'elvis'
end
item.save
end
以上代码使用所有修改后的注释用户名更新每个项目一次。我没有测试过代码。
答案 1 :(得分:0)
由于用户名实际上是嵌入式数组文档的一部分,因此您必须使用positional operator,如下所示:
Item.where('comments.username'=>'elvis33')。update_all('comments。$ .username'=>'elvis')