私はhas_many throughアソシエーション設定をソングモデルとアーティストモデルの間に持っています。 私のコードは、このRailsは重複を避けるためにhas_many
SongArtistMapモデルのようなもの
class SongArtistMap < ActiveRecord::Base
belongs_to :song
belongs_to :artist
end
アーティストモデル
class Artist < ActiveRecord::Base
has_many :song_artist_maps
has_many :songs, :through => :song_artist_maps
validates_presence_of :name
end
ソングモデル
class Song < ActiveRecord::Base
has_many :song_artist_maps
has_many :artists, :through => :song_artist_maps
accepts_nested_attributes_for :artists
end
に見える私は、ユーザーが歌を提出して入る形を持っています曲のタイトルと曲のアーティストで。
したがって、ユーザーは歌を提出し、ユーザーがで歌を提出した場合、私のアーティストテーブルにはすでに、私はそれがそのアーティストとセットアップ
SongArtistMap
でマップを作成したい曲のアーティストを持っていないときArtistテーブルに既に入っているアーティスト私は、SongArtistMapを作成したいがアーティストは複製されていないようにしたい。現在、ユーザーが曲をサブミットするたびに、同じアーティストが既に存在していてもそのアーティストのテーブルに新しいアーティストが作成され、そのコピーされたアーティストのSongArtistMapが作成されます。
どのようにこの問題に取り組んでいますか?レールがおそらくすでに組み込まれているこの問題を解決する簡単な小さなトリックを持っているような気がする。ありがとう!
あなたはメソッドを見つけることを知っていますか?あなたはメソッドの作成を知っていますか?まあ、Railsにはfind_or_create_by_attributeというメソッドがあります!したがって、あなたの場合、find_or_create_by_nameを使用することができます。ただし、ネストされた属性を使用しているので... [検索または作成でネストされた属性を受け入れる](http://stackoverflow.com/questions/3579924/accepts-nested-attributes-for-with-find-or-create) 。そう、ええ、これは重複した質問です。 – Ashitaka