0

我正在自学 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 字段留空。

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">

我在这里做错了什么?

4

2 回答 2

0

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

当您创建位置实例时,例如 Equipment 实例,将它们分配给新 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 关联的良好指南。

于 2013-05-27T18:35:40.933 回答
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

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

于 2013-05-28T18:32:44.580 回答