【问题标题】:Proper way to write a value for an attribute whose name is in a variable?为名称在变量中的属性写入值的正确方法?
【发布时间】:2013-09-04 10:11:39
【问题描述】:

大量搜索建议您可以使用 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 用户还应该使用什么?

【问题讨论】:

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


    【解决方案1】:

    您在第一个示例中很接近。发送不起作用的原因是因为您实际上是在尝试这样做:

    prj.project_start_date(Date.today)
    

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

    prj.project_start_date = Date.today
    

    这将转化为:

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

    【讨论】:

    • 感谢您让我的眼球不经意!
    猜你喜欢
    • 2021-10-21
    • 2013-01-29
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    相关资源
    最近更新 更多