Ruby on Rails 4 - 检查数据库

时间:2015-07-05 19:24:37

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

我有一个由专辑和艺术家组织的音乐库应用程序。用户可以通过包含轨道嵌套属性的专辑提交表单将音乐上传到服务器。上传相册后,应用程序应根据其名称检查数据库中是否已存在每个轨道。如果曲目已存在,则应将与相册的关联映射到现有记录,并且不应制作曲目的副本。我试图在我的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联接模型将Trackhas_many :through之间的关系从HABTM更改为AlbumTrack,以便在其上设置不同的曲目编号不同的专辑。现在,当我尝试将现有曲目上传到新专辑时,会形成重复的条目。我怀疑这个问题源于多对多关系之间的差异,因为没有创建重复的艺术家条目(由HABTM关联)。

这是一种解决方法,还是一种更好的方法?

0 个答案:

没有答案