0

ここと周りの多くの検索では、属性に値を書き込むために send() の 2 番目の引数を使用できることが示唆されましたが、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'

ドキュメントでは、これはインスタンスのパブリック メソッドの一部であると書かれているため、これは奇妙です。

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 ユーザーは何を使用することになっているのでしょうか?

4

1 に答える 1

2

あなたは最初の例に近いです。send が機能しない理由は、本質的に次のことをしようとしているためです。

prj.project_start_date(Date.today)

project_start_date メソッドは引数を取らないため、これは意味がありません。セッターに変更する必要があります

prj.project_start_date = Date.today

これは次のように変換されます。

prj.send("#{fieldname}=", Date.today)
于 2013-09-04T10:20:31.380 に答える