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

时间:2015-02-03 02:19:22

标签: ruby-on-rails ruby friendly-id

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

例如

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

我能够使用: 的配置/初始化/ 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时,它会生成一个test-slug-4的slug,这是因为我的错误 Slug已被采取。

2 个答案:

答案 0 :(得分:1)

一种选择是使用substring方法来查找最大数量。例如,在PostgreSQL中你可以做类似的事情:

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

答案 1 :(得分:0)

无论如何,我为此做了一个解决方法。 如果你下次创建一个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