Ruby on rails 为路由预先设置UUID以确保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文件来完成,因为仍然存在创建两个或

我正在使用友好的_id向我的模型及其相应的url添加自定义slug。目前我有一个设置,其中
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