0

私は次のモデルを持っています:ReleasesTrackshas_manyと呼ばれる結合ReleasesTrack

またProduct、(半)正常にリリーストラックを継承し、トラックとリリースIDがProductsTrackhas_many_through結合にコピーされていることもあります。

問題は、正しい位置の値を取得していないことです。

私は現在これをProductsTrackモデルに持っています、それはうまくいくように見えます、しかし私は私が望む値を得ていません。

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

トラックテーブルの位置の値の代わりに、has_many_through結合テーブルreleases_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

> 私は以下のモデルを持っています。リリース、トラック、および 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 に答える
0

おそらく、データ モデルをクリーンアップする必要があります。おそらく必要以上に複雑ですが、モデルが与えられたので、整理してみましょう。

  1. 継承はありません。すべてのレコード モデルは ActiveRecord::Base を継承しています。
  2. 基本的に、リリースとトラックの間に多対多の関係を持つリリース、トラック、および製品があり、トラックと製品の間に別の多対多の関係があります。
  3. また、製品はリリースに属し、製品はそのリリースを通じて has_many :releases_tracks します。

あなたの質問は

> 現在、ProductsTrack モデルにこれがあります。動作しているように見えますが、必要な値が得られません。

> トラック テーブルの位置の値の代わりに、その has_many_through ジョイン テーブル release_tracks からの位置が必要です。

あなたは ProductsTrack モデルをリストしていないので、これは Producttracklisting クラスだと思います。producttracklistings テーブルの位置フィールドを「has_many_through 結合テーブルreleases_tracksからの位置」に設定したいとします。

特定の producttracklistings レコードに対して release_tracks レコードが 1 つもないため、これを行うことはできません。producttracklistings は (belongs_to) トラック レコードを指しますが、releases_tracks レコードは track レコードを指します (その逆ではありません)。

于 2012-05-18T13:55:17.617 に答える