0

我是 Ruby on Rails 的新手,我很高兴能理解我的关联。

在我的公司,我们出租包含扫描仪和服务器的扫描仪包。

当我们收到扫描仪包的请求时,理想情况下,我会使用客户信息创建一个新的扫描仪包,并附加所需的许多扫描仪和服务器。

这是我的三个模型,scanner_pack,服务器和扫描仪:

扫描仪包.rb:

class ScannerPack < ActiveRecord::Base
  attr_accessible :producer, :reserved_from, :reserved_to, :scanner_id, :server_id, :scanner_pack_id

  has_many :scanners, :foreign_key => "scanner_id"
  has_many :servers, :foreign_key => "server_id"
end

服务器.rb:

class Server < ActiveRecord::Base
  attr_accessible :cat5, :power_cable, :router, :name, :status, :location, :id, :notes, :reserved_from, :reserved_to, :scanner_pack_id

  belongs_to :scanner_pack, :class_name => "Server", :foreign_key => "server_id"
end

扫描仪.rb:

class Scanner < ActiveRecord::Base
  attr_accessible :id, :location, :name, :notes, :serial, :status

  belongs_to :scanner_pack, :class_name => "Scanner", :foreign_key => "scanner_id"
end

我已经用谷歌搜索了很长一段时间,我注意到有时人们说要删除scanner_pack模型中scanner_id和server_id的attr_accessible,因为它会覆盖关联。当我这样做时,我得到了错误:

ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes:

在 Rails 控制台中,当我尝试创建新的 ScannerPack 时,我正在执行以下操作:

scanner = Scanner.find(1)
ScannerPack.create(:producer => 12345, :scanner_id => scanner.id)

然后,如果我尝试类似:

scannerpack = ScannerPack.find(1)
scannerpack.scanner_id 

它返回正确的值scanner_id

当我尝试时:scannerpack.scanner.id它给了我一个未定义的方法错误(我也尝试过scannerpack.scanners.id)。在我看来,它应该从扫描仪对象返回扫描仪的 ID

我在想我要么错过了一些非常简单的东西,要么完全误解了如何做到这一点。也许我应该使用has_and_belongs_to_many关联?任何人都可以提供任何帮助,我将不胜感激!

谢谢!

编辑:这是github上的整个项目。

4

2 回答 2

0

既然你想要多对多关联,这里是如何一步一步地实现这一点。

我们应该创建包含scanner_id和的模型scanner_pack_id。让我们为它命名Pack(我相信您将能够更好地命名它)。

rails g model Pack scanner_id:integer scanner_pack_id:integer
rake db:migrate

运行它时,您必须在模型中编写适当的“声明”:

class Pack
  belongs_to :scanner
  belongs_to :scanner_pack
end

class ScannerPack
  has_many :packs
  has_many :scanners, through: :packs
end

class Scanner
  has_many :packs
  has_many :scanner_packs, through: :packs
end

完成后,您可以轻松地scanner_packsscanner(反之亦然)绑定(例如):

scanner.scanner_packs << scanner_pack
于 2013-06-18T18:42:36.270 回答
0

belongs_to从和方法中删除所有其他参数has_many,只留下关联名称。

错误就在这里

:class_name => "Server"

和这里

:class_name => "Scanner"

参考http://guides.rubyonrails.org/association_basics.html#belongs_to-association-reference(向下滚动4.1.2 Options for belongs_to4.1.2.2 :class_name

于 2013-06-18T18:43:41.327 回答