gpt4 book ai didi

ruby-on-rails - Rails has_many 通过避免重复

转载 作者:行者123 更新时间:2023-12-03 00:08:30 25 4
gpt4 key购买 nike

我有一个 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 中设置 map

如果用户提交的歌曲的艺术家已在 Artists 表中,我只想创建 SongArtistMap 但不重复艺术家。

目前,每当用户提交一首歌曲时,即使相同的艺术家已经存在并且为该重复的艺术家创建了一个 SongArtistMap,也会在我的艺术家表中创建一个新的艺术家。

您知道如何解决这个问题吗?我觉得 Rails 可能已经内置了一些简单的小技巧来解决这个问题。谢谢!

最佳答案

好吧,我不久前就明白了这一点,但忘了发布。这就是我解决问题的方法。首先,我意识到我不需要有 has_many through 关系。

我真正需要的是一个has_and_belongs_to_many关系。我设置了它并为其制作了表格。

然后在我的 Artists 模型中添加了这个

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

这正是我想要的。

关于ruby-on-rails - Rails has_many 通过避免重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9935835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com