У меня есть релизы, в которых может быть много артистов, а артисты могут появиться во многих релизах. Художники могут быть созданы в моей форме выпуска с помощью вложенных атрибутов. У меня проблемы с тем, чтобы заставить find_or_create работать с художником.
У меня есть следующий код, определенный в моих моделях, и, как вы можете видеть, довольно нелепая процедура get/set/delete в модели ArtistRelease для достижения желаемого результата. Это работает, но мне это не нравится. Я знаю, что есть лучший способ через find_or_create. Кто-нибудь может помочь? Где я должен разместить find_or_create, чтобы это работало?
class Release < ActiveRecord::Base
has_many :artist_releases, :dependent => :destroy
has_many :artists, :through => :artist_releases
accepts_nested_attributes_for :artists, :reject_if => lambda { |a| a[:name].blank? }, :allow_destroy => :true
accepts_nested_attributes_for :artist_releases
end
class Artist < ActiveRecord::Base
has_many :artist_releases
has_many :releases, :through => :artist_releases
end
class ArtistRelease < ActiveRecord::Base
belongs_to :artist
belongs_to :release
before_create :set_artist_id
after_create :destroy_artist
default_scope :order => 'artist_releases.position ASC'
private
def set_artist_id
a = Artist.where("name =?", artist.name).reorder("created_at").find(:first)
a.role = artist.role
a.position = artist.position
a.save
artist_id = a.id
self.artist_id = artist_id
end
def destroy_artist
c = Artist.count(:all, :conditions => [ "name = ?", artist.name])
if c > 1
a = Artist.where("name =?", artist.name).reorder("created_at").find(:last)
a.destroy
end
end
end