Ruby on rails ActiveRecord::新建时AssociationTypeMismatch
Get-ActiveRecord::AssociationTypeMismatchRuby 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,
组件(#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]