我需要在Rails 3.2,Ruby 2应用程序中查找和更新许多记录。以下代码成功找到我想要的记录。我需要做的是将“x”(包括空格)添加到每个用户的电子邮件地址,我无法弄清楚如何做到这一点。
找到记录
User.joins(:account)
.where("users.account_id NOT IN (?)", [1955, 3083, 3869])
.where("accounts.partner_id IN (?)", [23,50])
.where("users.staff = '0'")
.where("users.admin = '0'")
.where("users.api_user = '0'")
.where("users.partner_id is null")
.update_all(email: :email.to_s << " X")
但这是我遇到问题的最后一行。这是可能的,还是我需要以另一种方式找到记录?
答案 0 :(得分:2)
尝试写下最后一行:
X
这使用SQL的字符串连接运算符将dt2
附加到电子邮件的末尾。
希望有所帮助!
答案 1 :(得分:2)
update_all
方法更新记录集合,但除非您编写自己的SQL表达式,否则它只能设置一个值。例如,如果您想用&#34; X&#34;覆盖所有电子邮件地址,您可以轻松完成:
User.joins(:account)
.where("users.account_id NOT IN (?)", [1955, 3083, 3869])
# ...other scopes...
.update_all(email: "X")
在您的情况下,您真正需要做的是对所有这些记录进行单独更新。一种方法是找到记录,然后遍历它们并一次更新一个:
users_to_update = User.joins(:account)
.where("users.account_id NOT IN (?)", [1955, 3083, 3869])
.where("accounts.partner_id IN (?)", [23,50])
.where("users.staff = '0'")
.where("users.admin = '0'")
.where("users.api_user = '0'")
.where("users.partner_id is null")
users_to_update.each do |user|
user.update_attribute(:email, "#{user.email} X")
end
另一个解决方案是使用带有update_all
的SQL表达式,如Zoran的答案。