我正在教自己Rails,我很难过为什么一个关联不能正常工作。我想我错过了一些非常基本的东西,但我不能完全扼杀它。
我有两个类 - 构建和设备。构建由2件设备组成,标题为position_1和position_2。这是我的定义:
class Build < ActiveRecord::Base
has_one :position_1, :class_name => "Equipment"
has_one :position_2, :class_name => "Equipment"
attr_accessor :position_1, :position_2
end
和
class Equipment < ActiveRecord::Base
belongs_to :build, :foreign_key => :position_1
belongs_to :build, :foreign_key => :position_2
end
(暂时忽略这可以通过关系表来处理以支持任意数量的位置 - 我基本上试图弄清楚如何将一个具有两个has_one关系的类放到另一个类中。)
现在,如果我尝试做这样简单的事情......
position_1 = Equipment.find(params[:build][:position_1])
position_2 = Equipment.find(params[:build][:position_2])
@build = Build.new
@build.position_1 = position_1
@build.position_2 = position_2
logger.debug("THE BUILD IS #{@build.inspect}")
我将成功创建一个构建对象,其中设备对象正确分配给position_1参数,但构建参数的position_1和position_2字段保留为nil。
logger.debug("THE EQUIPMENT IS #{@build.position_1}")
> EQUIPMENT IS #<Equipment:0x007fa0581705c0>
logger.debug("THE BUILD IS #{@build.inspect}")
> THE BUILD IS #<Build id: nil, position_1_id: nil, position_2_id: nil, created_at: "2013-05-27 18:00:32", updated_at: "2013-05-27 18:00:32">
我在这里弄错了什么?
答案 0 :(得分:0)
首先,我不会在“父”ActiveRecord中将关联包含为“attr_accessors”。 Rails为您创建正确的Build关联字段。
当您创建位置的实例时,如设备实例,将它们分配给新Build的正确方法是:
position_1 = Equipment.find(params[:build][:position_1])
position_2 = Equipment.find(params[:build][:position_2])
@build = Build.new
@build.position_1 << position_1
@build.position_2 << position_2
这是Rails associations的好指南。
答案 1 :(得分:0)
想出来 - 我误解了Rails如何做关联 - 我真正需要的是......
class Equipment < ActiveRecord::Base
has_many :builds, :foreign_key => :position_1
has_many :builds, :foreign_key => :position_2
end
class Build < ActiveRecord::Base
belongs_to :position_1, :class_name => "Equipment", :foreign_key => "position_1_id"
belongs_to :position_2, :class_name => "Equipment", :foreign_key => "position_2_id"
end
有了这个,一切都按照我的预期运作。