我有一个由专辑和艺术家组织的音乐库应用程序。用户可以通过包含轨道嵌套属性的专辑提交表单将音乐上传到服务器。上传相册后,应用程序应根据其名称检查数据库中是否已存在每个轨道。如果曲目已存在,则应将与相册的关联映射到现有记录,并且不应制作曲目的副本。我试图在我的Album
模型中实现这一点,我有以下代码:
class Album < ActiveRecord::Base
before_save :get_tracks
...
has_and_belongs_to_many :artists
has_many :album_tracks, counter_cache: true
has_many :tracks, through: :album_tracks
accepts_nested_attributes_for :tracks
accepts_nested_attributes_for :album_tracks, allow_destroy: true, reject_if: lambda {|a| a[:track_number].blank?}
def get_tracks
self.tracks = self.tracks.collect do |track|
track.artists = track.artists.collect do |artist|
Artist.find_or_create_by(name: artist.name, class_year: artist.class_year)
end
Track.create_with(artists: track.artists, audio: track.audio).find_or_create_by(name: track.name)
end
end
end
此代码一直有效,直到我使用Album
联接模型将Track
和has_many :through
之间的关系从HABTM更改为AlbumTrack
,以便在其上设置不同的曲目编号不同的专辑。现在,当我尝试将现有曲目上传到新专辑时,会形成重复的条目。我怀疑这个问题源于多对多关系之间的差异,因为没有创建重复的艺术家条目(由HABTM关联)。
这是一种解决方法,还是一种更好的方法?