В Rails, после использования find с: select, мои объекты не сохраняются - PullRequest
3 голосов
/ 18 сентября 2008

Запуск что-то вроде:

@ users = User.find (: first,: select => "имя, фамилия, зарплата") для @user в @users @ user.salary = 100000 @ user.save конец

После этого поиска в таблице Mysql пользователи не обновляются.

Ответы [ 5 ]

18 голосов
/ 18 сентября 2008

ActiveRecord не знает идентификатор объекта, чтобы сохранить данные. Поэтому включите поле id в: select, как в примере ниже:

@ users = User.find (: first,: select => "id, name, фамилия, оклад")

2 голосов
/ 18 сентября 2008

Джон Руби прав, что вам нужно включить идентификатор объекта в выборку.
Кроме того, вам редко нужно использовать опцию: select. Вы можете сделать это с помощью объединений, или если есть реальная проблема с производительностью при выборе всей строки, но это не так уж и много. И вам действительно не нужно устанавливать все эти переменные в экземпляры vars (@). @user в цикле может быть локальной переменной. Если вам нужны все пользователи как @users, вы можете сделать:

@users = User.find(:all, :select => "id, name, lastname, salary")
@users.each do |user|
  user.salary = 10000
  user.save
end

Возможно, вы также захотите посмотреть на update_all ActiveRecord для простых изменений. Но учтите, что это не вызывает никаких обратных вызовов сохранения.

0 голосов
/ 05 марта 2010

Я понимаю, что это довольно старый вопрос на данный момент, но правильный ответ, я считаю, что любые объекты, возвращаемые: select доступны только для чтения.

См. Официальное руководство Rails по запросам Active Record, раздел 3.2:
http://guides.rubyonrails.org/active_record_querying.html

Любопытно, что я не вижу этого документированного в API.

0 голосов
/ 18 сентября 2008

Использование .save! также выдаст ошибку, если не удастся сохранить.

0 голосов
/ 18 сентября 2008

Попробуйте вместо этого использовать .update или .update_attributes: они предназначены для редактирования (в отличие от .save, который предназначен для создания новых строк)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...