2013-06-18 51 views
0

我是Ruby on Rails的全新人物,我正在理解我的关联。Ruby on Rails协会没有生效

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

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

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

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 

我GOOGLE了,现在搜索相当一段时间,我发现有时人们说以删除scanner_id和SERVER_ID的attr_accessible在scanner_pack模型,因为它会覆盖的关联。当我这样做,我得到的错误:

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

在轨控制台,当我试图创建一个新的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的整个项目。

回答

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 
+0

由于马立克,我留在昨晚代码配合后尝试一切我遇到的小事,我已经删除它,它仍然不工作,我也更新了原来的问题如果这有助于整个项目。 – chantron

+0

你得到了什么错误? –

+0

我可以将扫描程序的ID分配给扫描程序包中的scanner_id,但似乎它只是分配整数并且没有与实际的扫描程序对象建立关联。 – chantron

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

+0

谢谢Michal。昨天晚上,我在尝试我遇到的所有小事情时都离开了那个代码。我已经删除它,它仍然无法正常工作。如果有帮助,我还更新了原始问题,并提供了整个项目的链接。 – chantron