Rails 3 - возможно сделать IF в запросе к базе данных - PullRequest
0 голосов
/ 12 июня 2011

У меня есть профиль пользователя, который зарегистрировался на моем форуме.

Person.update_all({:name => params[:person][:name],
                   :sex => params[:person][:sex],
                   :age => params[:person][:age],
                   :avatar => params[:person][:avatar].original_filename, 
                   :city => params[:person][:city]}, 
                   {:id => params[:id]})

Это запрос на обновление данных в базе данных.Но здесь есть небольшая проблема - это будет работать только в ситуации, если я отправлю пользователя через форму аватара (изображение).Если не отправлять аватар - это означает, что пользователь уже загрузил аватар, и в форме отправляется только имя, пол, возраст и город .Поэтому в этом случае я получу ошибку в строке : avatar => params [: person] [: avatar] .original_filename, - и я хотел бы спросить вас, если существует какой-то элегантный способкак лечить этот момент.

Я думал что-то вроде этого:

if params[:person][:avatar]
 avatar = ':avatar => params[:person][:avatar].original_filename,'
end
Person.update_all({:name => params[:person][:name],
                   :sex => params[:person][:sex],
                   :age => params[:person][:age],
                   avatar 
                   :city => params[:person][:city]}, 
                   {:id => params[:id]})

Но, к сожалению, это не работает ... Как вы решаете подобную ситуацию?Спасибо.

1 Ответ

1 голос
/ 12 июня 2011

Ну, похоже, ваши ключи params [: person] похожи на поля вашей модели.Так почему бы вам просто не передать params[:person] update_all?

В качестве альтернативы, вы можете создать хеш person, инициализировать его так, как вы хотите, а затем передать его update_all

person = { :name => params[:person][:name] ,
...
if params[:person][:avatar]
  person[:avatar] = params[:person][:avatar].original_filename
end

Person.update(params[:id], person)

Я изменил update_all на update, потому что update_all используется для обновления всех записей (соответствующих условию), тогда как update находит запись по ее идентификатору.

Но опять же, это плохая практика, и вам приходится вводить много ненужного кода.

Еще одна вещь.update_all делает прямой вызов БД, который не включает проверки, обратные вызовы и т. Д. Итак, если у вас нет особых причин для этого, вам лучше сделать что-то вроде этого:

@person = Person.find params[:id]
@person.update_attributes params[:person]

Я действительно думаю, что вы должны проверить эту книгу из

Обновлен еще раз:)

Видите ли, такие вещи принадлежат вашим моделям,не контроллеры.Вы можете определить сеттер в модели:

def avatar=(value)
  write_attribute(:avatar, value.original_filename)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...