使用 FriendlyId 在 slug 中有一个重复的数字序列

Having a duplicate number sequence in slug using FriendlyId

我正在使用 gem 'friendly_id', '~> 5.0.0,我只想使用旧行为,即在 slug 中附加一个数字序列计数,而不是 UUID

例如

>> test-slug-2
>> test-slug-3
>> test-slug-4

我能够使用: config/initializers/slugged.rb

module FriendlyId::Slugged
  def resolve_friendly_id_conflict(candidates)
    column = friendly_id_config.slug_column
    separator = friendly_id_config.sequence_separator
    slug = normalize_friendly_id(candidates.first)
    sequence = self.class.where("#{column} like '#{slug}#{separator}%'").count + 2
    "#{slug}#{separator}#{sequence}"
  end
end

在我的模型中

  extend FriendlyId
  friendly_id :name, use: [:slugged, :finders]

然而,当我有一个 test-slug-3test-slug-4 并试图在我下次创建记录时删除 test-slug-3 时,它会生成一个 slug,它是 test-slug-4这最终有一个错误,因为 鼻涕虫已经被拿走了。

一种选择是使用子字符串方法来查找最大数量。例如,在 PostgreSQL 中你可以这样做:

slug_start = "#{slug}#{separator}"
sequence = self.class.where("#{column} like '#{slug_start}%'").maximum("SUBSTR(#{column}, #{slug_start.length + 1})::Int") + 1

无论如何,我为此做了一个解决方法。 如果下次创建 slug 时 slug 已经被占用,它将获得类似 slug 的最大 id 并添加 +1 并附加到您将创建的下一个 slug。

这是我的代码:

 def resolve_friendly_id_conflict(candidates)
    column = friendly_id_config.slug_column
    separator = friendly_id_config.sequence_separator
    slug = normalize_friendly_id(candidates.first)
    count = self.class.maximum("id") + 1 || 1
    if self.class.where("#{column} like '#{slug}%'").count >= 1
      "#{slug}#{separator}#{count}"
    end
  end