2015-06-02 5 views
4

Мне нужно найти и обновить ряд записей в приложении Rails 3.2, Ruby 2. Следующий код успешно находит записи, которые я хочу. Что мне нужно сделать, это добавить «x» (включая пробел) на адрес электронной почты каждого пользователя, и я не могу понять, как это сделать.добавление значения поля rails

Это находит записи

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

Попробуйте написать последнюю строку так:

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

При этом используется оператор конкатенации SQL для добавления в X к концу сообщения электронной почты.

Надеюсь, что это поможет!

+0

Осторожно, это предполагает, что 'email' не равно null. В нормальном мире столбец НЕ был бы NULL, но утверждение предположения могло бы быть хорошей идеей. –

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, как в ответ Зоран в.

Смежные вопросы