【问题标题】:unable to specify value in ActiveRecord call (Ruby, Sinatra, not Rails)无法在 ActiveRecord 调用中指定值(Ruby、Sinatra,而不是 Rails)
【发布时间】:2015-09-30 23:28:26
【问题描述】:

我有一个名为 Admin 的模型对象的引用,它有一个名为 id 的字段。对象属性可在 puts 行中访问。我现在需要将该 ID 传递到 ActiveRecord 调用中以创建另一个对象(它用作外键),如下所示,但它会引发下面复制的异常(在 Bill.create 调用中没有获取 admin.id) :

admin = Admin.find_by(email:email)
puts "admin id #{admin.id}"  # this gets printed with correct value  
bill = Bill.create(admin_id: admin.id, body: body)

例外

/usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/attribute_assignment.rb:59:in `rescue in _assign_attribute': unknown attribute 'admin_id' for Bill. (ActiveRecord::UnknownAttributeError)
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/attribute_assignment.rb:54:in `_assign_attribute'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/attribute_assignment.rb:41:in `block in assign_attributes'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/attribute_assignment.rb:35:in `each'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/attribute_assignment.rb:35:in `assign_attributes'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/core.rb:564:in `init_attributes'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/core.rb:281:in `initialize'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/inheritance.rb:61:in `new'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/inheritance.rb:61:in `new'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/persistence.rb:33:in `create'
        from test.rb:34:in `<main>'

Bills 模型的 ActiveRecord 迁移

 def up
     create_table :bills do |t|
         t.integer :admin_id
         t.text :body
     end
    add_foreign_key :bills, :admins
  end

提前感谢您分享我做错了什么的见解。

【问题讨论】:

  • 该错误与 admin_id 不存在于您的 Bills 模型中有关,与来自 Admin 对象的 admin.id 无关。检查您的迁移。
  • 与其立即解决问题,不如真正重组它以使用belongs_to 关联...guides.rubyonrails.org/…

标签: ruby activerecord sinatra sinatra-activerecord


【解决方案1】:

根据我的评论,你真的应该把它变成belongs_to 关系,这是重构的迁移(使用最新的 Rails 4 语法):

class CreateBills < ActiveRecord::Migration
  def change
    create_table :bills do |t|
      t.references :admin
      t.text :body
    end
  end
end

将这些关系添加到模型中:

class Admin < ActiveRecord::Base
  has_many :bills
end

class Bill < ActiveRecord::Base
  belongs_to :admin
end

以及创建与管理员关联的账单的代码:

admin = Admin.find_by(email:email)
puts "admin id #{admin.id}"  # this gets printed with correct value  
bill = admin.bills.create(body: body)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 2015-12-03
    • 2021-06-07
    • 1970-01-01
    • 2014-11-17
    • 2015-12-06
    • 2013-07-04
    相关资源
    最近更新 更多