附加到rails字段值

时间:2015-06-02 22:20:30

标签: ruby ruby-on-rails-3

我需要在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 个答案:

答案 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的答案。