这与之前的问题类似,但我们的方法自此以后发生了一些变化。
我需要能够摧毁发行版和发行版之间的联系。曲目+产品&轨道没有破坏轨道本身。然后,我需要能够将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
有人能指出我正确的方向吗?正如我所说,我主要需要破坏,但我还需要能够重新建立联想。
答案 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