Rails has_one / belongs_to关联不按预期工作

时间:2013-05-27 18:30:33

标签: ruby-on-rails associations

我正在教自己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">

我在这里弄错了什么?

2 个答案:

答案 0 :(得分:0)

首先,我不会在“父”ActiveRecord中将关联包含为“attr_accessors”。 Rails为您创建正确的Bui​​ld关联字段。

当您创建位置的实例时,如设备实例,将它们分配给新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

有了这个,一切都按照我的预期运作。