繁体   English   中英

Rails has_one / belongs_to关联无法按预期工作

[英]Rails has_one/belongs_to associations not working as expected

我正在自学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参数的设备对象的构建对象,但是build参数的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">

我这是怎么了?

首先,我不会在“父” ActiveRecord中将这些关联包括为“ attr_accessors”。 Rails为您为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协会的好指南。

弄清楚了-我误解了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

有了这个适当的位置,一切都会按我的预期进行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM