将值追加到Rails字段中

4

我需要在一个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")

但是我遇到了最后一行的问题。这是否可能,或者我需要以另一种方式查找记录?
2个回答

2
update_all 方法用于更新一组记录,但除非您编写自己的 SQL 表达式,否则它只能设置一个值。例如,如果您想使用 "X" 覆盖所有电子邮件地址,那么可以轻松实现:
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

另一种解决方案是使用带有 SQL 表达式的 update_all,就像 Zoran 的回答中那样。

2

尝试像这样编写最后一行:

.update_all("email = email || ' X'")

这里使用SQL的字符串拼接运算符将X附加到电子邮件末尾。

希望能帮到您!


小心,这假设 email 不为空。在一个理智的世界中,该列应为 NOT NULL,但声明该假设可能是个好主意。 - mu is too short

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接