0

我有以下模型:Releases, Tracks& 一个has_many名为ReleasesTrack.

我也有Products (半)成功地继承了发布曲目,其中 Track & Release Id 被复制到ProductsTrackhas_many_through 连接。

问题是我没有得到正确的位置值。

我目前有这个ProductsTrack模型,它似乎工作,但我没有得到我想要的价值。

 before_save do
     self.position = self.track.position
 end

我想要的是 has_many_through 连接表 release_tracks 中的位置,而不是轨道表中的位置值。我尝试了以下变体,但没有任何乐趣:

 before_save do
    self.position = self.track.releases_track.position
 end

我确实认为在 Tracks 和 ReleasesTracks 中都有一个位置字段可能会导致问题,并且我在两者中都有这个原因是有原因的,但是我已经使用临时字段进行了测试,但事实并非如此。

我认为问题的症结在于结构self.track.releases_track.position正确。

或者

我在协会中遗漏了一些东西?

有任何想法吗?

编辑:模型添加(注意,ProductsTrack 实际上是名字不好的 Producttracklisting)

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

  has_many :releases_tracks, :dependent => :destroy, :after_add => :position_track
  has_many :tracks, :through => :releases_tracks, :order => "releases_tracks.position"

  accepts_nested_attributes_for :tracks, :reject_if => lambda { |a| a[:name].blank? }, :allow_destroy => :true
  accepts_nested_attributes_for :releases_tracks

  def position_track(track) 
   releases_tracks.each { |t| t.position = t.track.position }
  end

  def track_attributes=(track_attributes)
    track_attributes.each do |attributes|
    tracks.build(attributes)
    artists_tracks.build(attributes)
    end
  end 
end

class Track < ActiveRecord::Base
  has_many :releases_tracks, :dependent => :destroy
  has_many :releases, :through => :releases_tracks

  has_many :producttracklistings, :dependent => :destroy
  has_many :products, :through => :producttracklistings  
end

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

class Producttracklisting < ActiveRecord::Base
  belongs_to :product
  belongs_to :track

  before_save do
     self.position = self.track.position
  end
end

class Product < ActiveRecord::Base
  belongs_to :release
  has_many :releases_tracks, :through => :release, :source => :tracks      

  has_many :producttracklistings, :dependent => :destroy
  has_many :tracks, :through => :producttracklistings

  accepts_nested_attributes_for :tracks, :reject_if => lambda { |a| a[:name].blank? }, :allow_destroy => :true
  accepts_nested_attributes_for :producttracklistings

  #Below is where a product inherits tracks from the parent release
  before_save do
    self.track_ids = self.releases_track_ids 
  end          
end
4

2 回答 2

0

您的数据模型可能需要清理。它可能比你需要的复杂得多,但是,给定模型,让我们把事情弄清楚。

  1. 没有继承。所有的记录模型都继承自 ActiveRecord::Base。
  2. 您基本上拥有发布、轨道和产品,发布和轨道之间存在多对多关系,轨道和产品之间存在多对多关系。
  3. 此外,products belongs_to 发布和 products has_many :releases_tracks 通过它的发布。

你的问题是

> 我目前在 ProductsTrack 模型中有这个,它似乎工作,但我没有得到我想要的价值。

> 而不是轨道表中的位置值,我想要它的位置,它是 has_many_through 连接表 release_tracks。

您没有列出 ProductsTrack 模型,因此我假设这是 Producttracklisting 类。您想将 producttracklistings 表中的位置字段设置为“来自它的has_many_through 连接表 release_tracks 的位置”。

所以答案是你不能这样做,因为给定的 producttracklistings 记录没有一个 release_tracks 记录。producttracklistings 指向 (belongs_to) 轨道记录,但 release_tracks 记录指向轨道记录(而不是相反),因此可以有从 0 到许多的任意数量的 release_tracks 记录,这是您的问题所指的。

于 2012-05-18T13:55:17.617 回答
0

> 我有以下型号;Releases、Tracks 和一个名为 ReleasesTrack 的 has_many_through 连接

所以你有了

class Release < ActiveRecord::Base
  has_many :release_tracks
  has_many :tracks, :through => :release_tracks
end

class Track < ActiveRecord::Base
  has_many :release_tracks
  has_many :releases, :through => :release_tracks
end

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

> 我也有(半)成功继承发布轨道的产品,其中轨道和发布 ID 被复制到 ProductsTrack has_many_through 连接。

class Products < ReleaseTrack
  #uses table release_tracks
  #belongs_to :release #from inheritance
  #belongs_to :track #from inheritance
end

> 我目前在 ProductsTrack 模型中有这个,它似乎工作,但我没有得到我想要的价值。

ProductsTrack 型号是什么? 您之前的意思是说您有一个继承自发布轨道的 ProductsTrack 吗?

class ProductsTrack < ReleaseTrack
  #uses table release_tracks
  #belongs_to :release #from inheritance
  #belongs_to :track #from inheritance

  before_save do
    self.position = self.track.position
  end
end

> 而不是轨道表中的位置值,我想要它的位置,它是 has_many_through 连接表 release_tracks。

到目前为止,我根据您所说的对其进行编码的方式,self.positionhas_many_through 连接表 release_tracks 中的位置。

于 2012-05-17T19:46:22.490 回答