加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

这完全符合我的要求.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读