为名称在变量中的属性写入值的正确方法?

时间:2013-09-04 10:11:40

标签: ruby-on-rails activerecord ruby-on-rails-4 rails-activerecord

这里和周围的大量搜索建议你可以使用第二个参数send()来为属性写一个值,但在Rails 4中你会被告知你有错误的参数数量:

> prj = Project.where(:id => 123).first
> fieldname = "project_start_date"
> prj.send(fieldname, Date.today)
ArgumentError : wrong number of arguments (1 for 0)

这种方法被认为是

的同义词
> prj.write_attribute(fieldname, Date.today)

的错误
NoMethodError : private method `write_attribute'

这是奇怪的,因为docs说这是实例公共方法的一部分。

ActiveRecord文档建议使用类update方法:

# Updates one record
Person.update(15, user_name: 'Samuel', group: 'expert')

# Updates multiple records
people = { 1 => { "first_name" => "David" }, 2 => { "first_name" => "Jeremy" } }
Person.update(people.keys, people.values)
So what's a Rails 4 guy supposed to do?

在我的情况下,这将转化为:

Project.update(123, project_start_date: '2013/09/04') #not using variables for testing sake

这让我感觉很好:

 ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR:  zero-length delimited identifier at or near """"
LINE 1: ...dual".* FROM "project"  WHERE "project"."" = $1 LI...

那么除了写出实际的SQL语句之外,Rails 4用户应该使用什么?

1 个答案:

答案 0 :(得分:2)

你的第一个例子就近了。发送无效的原因是因为您实际上是在尝试:

prj.project_start_date(Date.today)

这没有意义,因为project_start_date方法不接受参数。您需要将其更改为setter

prj.project_start_date = Date.today

将转换为:

prj.send("#{fieldname}=", Date.today)