Rails 3 - 可以在数据库查询中生成IF

时间:2011-06-12 11:17:08

标签: ruby-on-rails ruby database conditional-statements

我有一张在我论坛注册的用户个人资料卡。

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 个答案:

答案 0 :(得分:1)

好吧,好像,你的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通过它查找记录ID。

但同样,这是一个不好的做法,你必须输入许多不必要的代码。

还有一件事。 update_all进行直接数据库调用,不涉及验证,回调等。 所以,如果你没有特别的理由,你最好这样做:

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

我真的认为,你应该检查this book

再次更新:)

你知道,这些东西属于你的模型,而不是控制器。您可以在模型中定义一个setter:

def avatar=(value)
  write_attribute(:avatar, value.original_filename)
end