2012-03-19 60 views
1

這與之前的問題很相似,但是我們的方法稍有改變。創建並銷燬HABTM關聯 - 不是實際記錄?

我需要能夠銷燬版本之間的關聯&曲目+產品&曲目不會破壞曲目本身。然後,我需要能夠將Track與任何發行版或產品重新關聯。

我的型號如下:

class Release < ActiveRecord::Base 
    has_many :products, :dependent => :destroy 
    has_and_belongs_to_many :tracks 
end 

class Product < ActiveRecord::Base 
    belongs_to :release 
    has_many :releases_tracks, :through => :release, :source => :tracks  
    has_and_belongs_to_many :tracks 
    before_save do 
    self.track_ids = self.releases_track_ids 
    end   
end 

class Track < ActiveRecord::Base 
    has_and_belongs_to_many :releases 
    has_and_belongs_to_many :products 
end 

class ReleaseTracks < ActiveRecord::Base 
    belongs_to :release 
    belongs_to :track 
end 

class ProductsTracks < ActiveRecord::Base 
    belongs_to :product 
    belongs_to :track 
end 

任何人都可以用適當的控制器方法幫助嗎?

如果我請使用以下例如產品導軌,它破壞了田徑協會:

@product = Product.find(params[:product_id]) 
@track = @product.tracks.find(params[:id]) 
@track.destroy 

我已經試過這樣的事情,但它給了我一個notmethoderror:

@product = Product.find(params[:product_id]) 
@track = @product.products_tracks.find(params[:track_id]) 
@track.destroy 

任何人都可以將我指向正確的方向嗎?正如我所說,我主要需要銷燬,但我還需要重新創建關聯。

回答

1

has_and_belongs_to_many(HABTM)是一種聲明兩個模型之間多對多關係的方法。在封面下,rails使用一個簡單的連接表(一個只有兩列的表,每個主表的主鍵都有一個外鍵)。當連接表中的記錄存在時,該關聯就存在。我不知道destroy在這種情況下默認如何工作,但它可能決定刪除所有關聯的記錄(不僅僅是關聯)。您可以通過使用HABTM聲明中的dependent <action>條款來控制此情況。當您將一個或多個「孩子」分配給父母並保存時,會創建該關係。

在這種情況下,也許你想要的是一對has_many:通過關係 - 「through」是一個關係,但可以被視爲第一類模型,並且用ActiveRecord進行擴展和操作,這意味着你可以獲得特定的發佈軌道(例如)並決定刪除它而不影響任何關聯。

有關於何時該Rails的指南中使用一種與其他一個很好的部分:http://guides.rubyonrails.org/association_basics.html#choosing-between-has_many-through-and-has_and_belongs_to_many

+0

是的,你說得對,我已經調整了我的曲目/產品型號,但我現在得到一個「未初始化不斷的產品::產品追蹤'錯誤? – Raoot 2012-03-19 14:13:43

+0

您是否刪除了原始問題中提到的類定義並生成了新的模型類(並運行了數據庫遷移)? – 2012-03-19 14:22:50

+0

工作,非常感謝! – Raoot 2012-03-19 15:40:12

相關問題