Ruby on rails 为路由预先设置UUID以确保slug的唯一性
我正在使用友好的_id向我的模型及其相应的url添加自定义slug。目前我有一个设置,其中Ruby on rails 为路由预先设置UUID以确保slug的唯一性,ruby-on-rails,routing,friendly-id,Ruby On Rails,Routing,Friendly Id,我正在使用友好的_id向我的模型及其相应的url添加自定义slug。目前我有一个设置,其中Post属于板。毫无疑问,在某些情况下,一个职位与另一个职位的头衔相同,但来自不同的董事会。我经常注意到网站(包括在内)在slug之前预先准备一组唯一的数字,以确保不存在唯一性问题: https://stackoverflow.com/questions/123456/my-example-question 我想知道实现这一目标的最佳方法是什么?这不能仅仅通过routes文件来完成,因为仍然存在创建两个或
Post
属于板
。毫无疑问,在某些情况下,一个职位与另一个职位的头衔相同,但来自不同的董事会。我经常注意到网站(包括在内)在slug之前预先准备一组唯一的数字,以确保不存在唯一性问题:
https://stackoverflow.com/questions/123456/my-example-question
我想知道实现这一目标的最佳方法是什么?这不能仅仅通过routes文件来完成,因为仍然存在创建两个或更多相同帖子的可能性。这会是一种改变我的模型、路由文件和友好的gem配置的组合吗
我的最终目标是为我的帖子生成如下url:
https://example.com/boards/example-board/123456/example-post
编辑 您可以在路线中执行以下操作:
resources :boards do
resources :posts, path: ':board_real_id'
end
并将params[:board\u real\u id]
添加到查询中
古老的
我认为你不需要UUID(除非你愿意)。你可以使用候选人
,如果两篇帖子的名字相同,并且属于同一个板块,只需插入帖子的id就可以了,你会得到类似https://example.com/boards/example-board/123456-example-post
发件人:
由于UUID很丑,FriendlyId提供了一个“slug候选者”
用于指定在事件中使用的备用段塞的功能
您要使用的已被占用。例如:
您需要使用
slug\u候选者
,请参阅文档
在您的情况下,您只需要在slug的末尾/开头添加一个uuid,您可以通过使用增量uuid来实现这一点。如果您有当前slug的a记录,则获取max uuid并将其增加1,然后保存它
class Post < ApplicationRecord
extend FriendlyId
belongs_to :board
friendly_id :slug_candidates, use: :slugged
def slug_url
name
end
def slug_candidates
[:slug_url, [:slug_url, :slug_uuid]]
end
def slug_uuid
result = Post.select("COUNT(REGEXP_SUBSTR(name, '[0-9]+$')) AS cnt, MAX(REGEXP_SUBSTR(title, '[0-9]+$')) + 1 AS mx_uuid")
result.cnt == 0 ? "" : result.mx_uuid + 1
end
end
class Post
我使用MYSQL语法来匹配正则表达式模式
如果你不在乎uuid,@luisenrike answer更好,它不会额外查询生成uuid作为我的,但如果你需要它,你将需要我的。我碰巧遇到了这个选项,但想知道是否有一种方法可以创建一个模拟目录,而不是在slug前面加上前缀。再次查看我的帖子,了解我想要的输出。
resources :boards do
resources :posts, path: ':board_real_id'
end
friendly_id :slug_candidates, use: :slugged
# Try building a slug based on the following fields in
# increasing order of specificity.
def slug_candidates
[
:name,
[:id, :name]
]
end
class Post < ApplicationRecord
extend FriendlyId
belongs_to :board
friendly_id :slug_candidates, use: :slugged
def slug_url
name
end
def slug_candidates
[:slug_url, [:slug_url, :slug_uuid]]
end
def slug_uuid
result = Post.select("COUNT(REGEXP_SUBSTR(name, '[0-9]+$')) AS cnt, MAX(REGEXP_SUBSTR(title, '[0-9]+$')) + 1 AS mx_uuid")
result.cnt == 0 ? "" : result.mx_uuid + 1
end
end