ruby-on-rails – Rails具有避免重复的功能
发布时间:2020-12-17 02:01:27 所属栏目:百科 来源:网络整理
导读:我在歌曲模型和艺术家模型之间建立了一个has_many关联设置. 我的代码看起来像这样 SongArtistMap模型 class SongArtistMap ActiveRecord::Base belongs_to :song belongs_to :artistend 艺术家模型 class Artist ActiveRecord::Base has_many :song_artist_m
我在歌曲模型和艺术家模型之间建立了一个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中设置地图 如果用户使用艺术家表中已有的艺术家提交歌曲,我只想创建SongArtistMap,但艺术家不会重复. 目前,每当用户提交歌曲时,即使已存在相同的艺术家表格,也会在该艺术家表格中创建新艺术家,并为该重复的艺术家创建一个SongArtistMap. 有关如何解决这个问题的任何想法?我觉得rails可能有一些简单的小技巧来解决已经内置的问题.谢谢! 解决方法
好的,我前一段时间弄清楚这个问题而忘了发帖.所以这就是我如何解决我的问题.首先,我意识到我不需要有一个has_many通过关系.
我真正需要的是一个has_and_belongs_to_many关系.我设置了它并为它做了表. 然后在我的艺术家模型中我添加了这个 def self.find_or_create_by_name(name) k = self.find_by_name(name) if k.nil? k = self.new(:name => name) end return k end 在我的Song模型中,我添加了这个 before_save :get_artists def get_artists self.artists.map! do |artist| Artist.find_or_create_by_name(artist.name) end end 这完全符合我的要求. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |