Ruby - 如何创建动态模型属性?

时间:2013-02-28 18:45:08

标签: ruby-on-rails ruby arrays model attributes

我有一个带有模型属性的数组(这些模型属性是DB表中的列)。我试图遍历这个数组并自动创建一个我想保存到DB表的记录,如下所示:

columns.each_with_index do |c, i|
  user.c = data[i]
  puts user.c
end

user是模特。 但是,如果我尝试上面的代码片段,我会得到

undefined method `c=' for #<User:0x007f8164d1bb80>

我也试过了

columns.each_with_index do |c, i|
  user."#{c}" = data[i]
  puts user."#{c}"
end

但这不起作用。

columns数组中的数据来自发送用户的表单,因此我只想保存他发送给我的数据,但我仍然无法弄清楚...

我想请你帮忙...先谢谢你!

3 个答案:

答案 0 :(得分:3)

user.send("#{c}=".to_sym, data[i])

此外,您可以将属性作为哈希值来访问。

user.attributes[c] = data[i]

答案 1 :(得分:0)

最好的办法可能是构建一个哈希并使用update_attributes:

mydata = {}
columns.each_with_index{|c, i| mydata[c] = data[i]}
user.update_attributes(mydata)

这样您就可以保留attr_accessible提供的保护。

答案 2 :(得分:0)

如果这实际上是在控制器中,您可以使用一些基本的rails约定并构建如下的用户记录:

@user = User.new(params[:user])
if @user.save
  # do something
else
  # render the form again
end

虽然您可以使用send设置值,但我同意@DaveS您可能希望通过attr_accessible保护自己。如果您打算使用Rails 4,here's a good overview