Ruby on rails ActiveRecord::新建时AssociationTypeMismatch

Ruby on rails ActiveRecord::新建时AssociationTypeMismatch,ruby-on-rails,ruby,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby,Ruby On Rails 3,Activerecord,Get-ActiveRecord::AssociationTypeMismatch组件(#70354292616060)应为,在下面创建对象“Machine”时获得字符串(#70354278277000) 目标:尝试为引用其他模型的模型分配“属性” 问题:我想听听专家的意见,这种手术的最佳做法是什么 设置: Rails 3.2.12/Ruby 1.9.3-p194: 型号: class Machine < ActiveRecord::Base attr_accessible :cpu,

Get-ActiveRecord::AssociationTypeMismatch
组件(#70354292616060)应为,在下面创建对象“Machine”时获得字符串(#70354278277000)

目标:尝试为引用其他模型的模型分配“属性”

问题:我想听听专家的意见,这种手术的最佳做法是什么

设置

Rails 3.2.12/Ruby 1.9.3-p194:

型号:

class Machine < ActiveRecord::Base
  attr_accessible :cpu, :name, :ram

  belongs_to :cpu, class_name: "Component", foreign_key: "component_id"
  belongs_to :ram, class_name: "Component", foreign_key: "component_id"
end

class Component < ActiveRecord::Base
  attr_accessible :name
  has_many :machines
end
所以我必须创建以下模型方法

  class Machine < ActiveRecord::Base

  (snip)

  def cpu
    Component.find_by_id(self.cpu_id)
  end

  def ram
    Component.find_by_id(self.ram_id)
  end
但我觉得这是多余的,我正在寻找一种更简单的方法来做到这一点


如果您有任何建议,我将不胜感激。

因此,如果我没有读错,您需要能够在表单中为其他模型设置字段

这是嵌套属性

在@machines的
表单中为@components
创建
表单,并从
Machine
模型中为这些字段授予
attr\u accessible
权限


这很有帮助

首先,让您的选择框使用cpu\u id和ram\u id是正确的做法。如果不这样做,rails将(稍微简化)这样做

参数始终是字符串,因此这是在尝试将字符串分配给关联,因此出现了一个错误,即该关联需要一个组件,但得到一个字符串

第二个问题是如何声明关联:您将ram和cpu关联都设置为使用component_id列来存储相应列的id,这显然无法工作。相反,您可能希望CPU关联使用CPU\u id列,而ram关联使用ram\u id列。这实际上是默认的-删除传递给所属调用的外键选项,应该可以


不过,您在组件上的关联需要一个外键选项。最简单的事情是为组件充当CPU的机器建立一个关联,为ram建立另一个关联。您可以考虑设置单表继承,在这种情况下,CPU子类只具有与CPUIID相关的关联,而RAM子类只具有与RAMIDSID

相关的关联性,您应该查看NeStdIsAtvices;谢谢Yoshiji先生的建议,我会试一试的。我不应该漏掉那一部分。设置了可访问的表单和属性。机器的表有一个名为“cpu\u id:integer”和“ram\u id:integer”的列,以及attr\u accessible::cpu\u id,:ram\u id。非常感谢弗雷德里克的建议。在更改外键后,它的工作方式与预期一致。(没有冗余模型方法)。
1.9.3-p194 :001 > Machine.first
  Machine Load (0.1ms)  SELECT "machines".* FROM "machines" LIMIT 1
 => #<Machine id: 2, name: "test", cpu_id: 1, ram_id: 1, created_at: "2013-05-06     16:42:47", updated_at: "2013-05-06 16:42:47"> 
1.9.3-p194 :002 > Machine.first.cpu
  Machine Load (0.2ms)  SELECT "machines".* FROM "machines" LIMIT 1
 => nil 
1.9.3-p194 :003 > Machine.first.ram
  Machine Load (0.2ms)  SELECT "machines".* FROM "machines" LIMIT 1
 => nil 
  class Machine < ActiveRecord::Base

  (snip)

  def cpu
    Component.find_by_id(self.cpu_id)
  end

  def ram
    Component.find_by_id(self.ram_id)
  end
1.9.3-p194 :002 > Machine.first.cpu.name
  Machine Load (0.2ms)  SELECT "machines".* FROM "machines" LIMIT 1
  Component Load (0.2ms)  SELECT "components".* FROM "components" WHERE "components"."id" = 1 LIMIT 1
  => "CPU1" 
machine.cpu = params[:machine][:cpu]