批量更新属性

时间:2012-12-24 03:39:23

标签: ruby-on-rails ruby activerecord sinatra

我正在使用Sinatra,但我猜这也适用于Rails(如果没有,请删除标签或告诉我,我会将其删除)。

我有一个ActiveRecord :: Base类User。它有很多属性,我正在显示一个允许某人更新特定用户的页面。问题是,我很难以干燥的方式实现更新功能。我的意思是,当我通过POST请求获得params时,我可以这样做:

a_user.update_attributes params

因为params也含有其他垃圾(比如:splat - 那是什么?)并且它会抛出一个未知的属性错误。我需要做的是:

a_user.update_attributes {:attrA => params[:attrA], 
                          :attrB => params[:attrB], ...etc } 

(请记住,有很多属性)

这是我应该怎么做的?对我来说,出于某种原因......感觉不对。例如,如果我有另一个需要以类似方式更新的模型,我必须再次手动重写所有属性。

我正在寻找的是一些像:

a_user.filter_and_update_attributes params

其中filter_and_update_attributes自动过滤任何坏/未知属性的参数,我可以在任何模型的任何地方使用它,必须重写这么多无用的代码。

由于

2 个答案:

答案 0 :(得分:6)

如果您按照以下方式构建表单:

<form action="/users" method="post">
  <input id="user_email" name="user[email]" type="text">
  <input id="user_name" name="user[name]" type="text">
  <input id="user_phone_number" name="user[phone_number]" type="text">
  ...
  <input id="user_email" name="user[email]" type="text">
  <input name="commit" type="submit" value="Submit">
</form>

你应该能够使用这样的参数:

@user.update_attributes params[:user]

当您为html字段命名为user[email]时,params哈希看起来像:

{ user: { email: "example@example.com", name: "Example" } }

因此,使用params[:user]可以获得属于该用户的嵌套参数哈希值。

答案 1 :(得分:-1)

您可以使用select过滤哈希值。查找模型的all attributes列表,并测试密钥是否在该列表中:

attrs = a_user.attributes.keys - User.protected_attributes.to_a
a_user.update_attributes params.select {|k,v| attrs.include?(k)}