2013-06-18 103 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