为活动记录关系字段分配值

时间:2016-11-10 06:39:58

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

这是我的第一个模特:

class Sender < ApplicationRecord
    has_many :letters
end

这是第二个:

class Letter < ApplicationRecord
  belongs_to :sender
end

我在rails Consol中找到这样一封信:

@letter = Letter.where(id: 378)

结果是:

#<ActiveRecord::Relation [#<Letter id: 378, indicator: "95/2", classification: "aa", urgency: "aa", package_id: nil, registrar_id: 0, user_id: nil, subset_type: "official", created_at: "2016-11-10 06:02:14", updated_at: "2016-11-10 06:02:14", sender_id: nil>]>

您可以看到 sender_id nil 。 我想要的是为sender_id设置一个值,如下所示:

@letter.sender_id = 12

但我得到了 错误

NoMethodError: undefined method `sender_id=' for #<Letter::ActiveRecord_Relation:0x00000004cc96c0>
Did you mean?  send_later
    from /var/lib/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/relation/delegation.rb:123:in `method_missing'
    from /var/lib/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/relation/delegation.rb:93:in `method_missing'
    from (irb):19
    from /var/lib/gems/2.3.0/gems/railties-5.0.0.1/lib/rails/commands/console.rb:65:in `start'
    from /var/lib/gems/2.3.0/gems/railties-5.0.0.1/lib/rails/commands/console_helper.rb:9:in `start'
    from /var/lib/gems/2.3.0/gems/railties-5.0.0.1/lib/rails/commands/commands_tasks.rb:78:in `console'
    from /var/lib/gems/2.3.0/gems/railties-5.0.0.1/lib/rails/commands/commands_tasks.rb:49:in `run_command!'
    from /var/lib/gems/2.3.0/gems/railties-5.0.0.1/lib/rails/commands.rb:18:in `<top (required)>'
    from bin/rails:4:in `require'
    from bin/rails:4:in `<main>'

出了什么问题?

2 个答案:

答案 0 :(得分:1)

Letter.where(id: 378)

返回与查询条件匹配的 集合 。当然,对于sender_id=对象,您没有方法ActiveRecord::Relation

你想要的只是一条记录,可以通过

获得
@letter = Letter.where(id: 378).first

@letter = Letter.find(id: 378)

现在,拥有一条记录,您可以更新它的sender_id属性:

@letter.update(sender_id: 12)

答案 1 :(得分:1)

应该是

@letter = Letter.find_by_id(378)

# or

@letter = Letter.find(378)

因为

@letter = Letter.where(id: 378)

会返回一组记录