创建和销毁HABTM关联 - 而不是实际记录?

时间:2012-03-19 12:13:50

标签: ruby-on-rails ruby-on-rails-3 activerecord

这与之前的问题类似,但我们的方法自此以后发生了一些变化。

我需要能够摧毁发行版和发行版之间的联系。曲目+产品&轨道没有破坏轨道本身。然后,我需要能够将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

我尝试过这样的事情,但它给了我一个令人遗憾的错误:

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

有人能指出我正确的方向吗?正如我所说,我主要需要破坏,但我还需要能够重新建立联想。

1 个答案:

答案 0 :(得分:1)

has_and_belongs_to_many(HABTM)是在两个模型之间声明多对多关系的一种方式。在封面下,rails使用一个简单的连接表(一个只有两列的表,每个表都是主表主键的外键)。当连接表中的记录存在时,存在关联。在这种情况下,我不确定destroy默认是如何工作的,但它可能决定删除所有相关记录(而不仅仅是关联)。您可以通过使用HABTM声明中的dependent <action>子句来控制它。将一个或多个“子项”分配给父项并保存时,将创建该关系。

在这种情况下,也许你想要的是一对has_many:通过关系 - “通过”是一种关系,但可以被视为一级模型,并使用ActiveRecord进行扩展和操作,这意味着你可以获取特定的发布跟踪(例如)并决定删除它而不影响任何关联。

在此Rails指南中有一个关于何时使用其中一个与另一个的好部分:http://guides.rubyonrails.org/association_basics.html#choosing-between-has_many-through-and-has_and_belongs_to_many