Ruby on Rails关联没有生效

时间:2013-06-18 18:32:11

标签: ruby-on-rails ruby

我是Ruby on Rails的新手,我很想知道我的关联。

在我的公司,我们租用了扫描仪包,其中包括扫描仪和服务器。

当我们收到扫描仪包的请求时,理想情况下我会创建一个包含客户信息的新扫描包,但需要连接许多扫描仪和服务器。

以下是我的三个型号scan_pack,server和scanner:

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

server.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

scanner.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

我已经搜索了很长一段时间并且已经搜索了很长一段时间,我注意到有时人们会说删除scan_pack模型中的scanner_so和scan_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上的整个项目。

2 个答案:

答案 0 :(得分:0)

由于您希望拥有多对多关联,因此以下是如何逐步实现此目标。

我们应该创建包含scanner_idscanner_pack_id的模型。我们将它命名为Pack(我相信你能够更好地命名)。

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

当你运行它时,你必须在你的模型中写下appripriate“声明”:

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

答案 1 :(得分:0)

belongs_tohas_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