2012-03-19 52 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