gpt4 book ai didi

ruby-on-rails - has_and_belongs_to_many,避免连接表中的重复

转载 作者:行者123 更新时间:2023-12-03 05:45:10 24 4
gpt4 key购买 nike

我有一组非常简单的 HABTM 模型

class Tag < ActiveRecord::Base 
has_and_belongs_to_many :posts
end

class Post < ActiveRecord::Base
has_and_belongs_to_many :tags

def tags= (tag_list)
self.tags.clear
tag_list.strip.split(' ').each do
self.tags.build(:name => tag)
end
end
end

现在一切正常,除了标签表中出现大量重复项。

我需要做什么才能避免标签表中出现重复(基于名称)?

最佳答案

仅在 View 中防止重复(惰性解决方案)

以下内容不会阻止将重复关系写入数据库,它仅确保find方法忽略重复项。

在 Rails 5 中:

has_and_belongs_to_many :tags, -> { distinct }

注意:Relation#uniq 在 Rails 5 中已被弃用 ( commit )

在 Rails 4 中

has_and_belongs_to_many :tags, -> { uniq }
<小时/>

防止保存重复的数据(最佳解决方案)

选项 1:防止 Controller 重复:

post.tags << tag unless post.tags.include?(tag)

但是,多个用户可以同时尝试 post.tags.include?(tag),因此这会受到竞争条件的影响。这是讨论的here

为了保持鲁棒性,您还可以将其添加到 Post 模型 (post.rb)

def tag=(tag)
tags << tag unless tags.include?(tag)
end

选项 2:创建唯一索引

防止重复的最简单方法是在数据库层设置重复约束。这可以通过在表本身上添加唯一索引来实现。

rails g migration add_index_to_posts
# migration file
add_index :posts_tags, [:post_id, :tag_id], :unique => true
add_index :posts_tags, :tag_id

获得唯一索引后,尝试添加重复记录将引发 ActiveRecord::RecordNotUnique 错误。处理这个问题超出了这个问题的范围。查看this SO question

rescue_from ActiveRecord::RecordNotUnique, :with => :some_method

关于ruby-on-rails - has_and_belongs_to_many,避免连接表中的重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1129781/

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