Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 对重复的段塞使用数字序列[Friendly ID]_Ruby On Rails_Friendly Id - Fatal编程技术网

Ruby on rails 对重复的段塞使用数字序列[Friendly ID]

Ruby on rails 对重复的段塞使用数字序列[Friendly ID],ruby-on-rails,friendly-id,Ruby On Rails,Friendly Id,我注意到上面写着:以前版本的FriendlyId附加了一个数字序列以使slug唯一,但为了简化在并发代码中使用FriendlyId,这一点被删除了。 有没有办法恢复到这种格式?我的模型只有名称,因此没有任何其他可行的slug候选对象(时间或日期在这种情况下对slug候选对象没有意义) 如何更改此内容(当前格式): 为此: car.friendly_id #=> "peugeot-206" car2.friendly_id #=> "peugeot-206-1" car3.friend

我注意到上面写着:
以前版本的FriendlyId附加了一个数字序列以使slug唯一,但为了简化在并发代码中使用FriendlyId,这一点被删除了。

有没有办法恢复到这种格式?我的模型只有
名称
,因此没有任何其他可行的slug候选对象(
时间
日期
在这种情况下对slug候选对象没有意义)

如何更改此内容(当前格式):

为此:

car.friendly_id #=> "peugeot-206"
car2.friendly_id #=> "peugeot-206-1"
car3.friendly_id #=> "peugeot-206-2"

有充分的理由将“序列号”替换为UUID(竞争条件)。
我通常使用一个ID为的额外slug候选者,该候选者由db维护uniq,比UUID短得多:

[ [:name], [:name, :id] ]
我知道你说过

(在这种情况下,时间或日期对slug候选人没有意义)

但是,假设您只是指时间的字符串格式,而不是unix,它是一个数字序列,那么我提出了解决您的问题/顾虑的方法:

  • 您的模型只有名称属性
  • 您不能使用id附加到slug,因为它还没有创建
  • 您希望slug是uniq并递增的
  • 您不想使用UUID

  • 注意:的数字是递增的

    Time.now.to_f*1000将是毫秒,我正在使用
    Time.now.to_f*1000000,即微秒旧行为是在特殊情况下实现的。但目前还没有发布。因此,如果你想恢复旧的行为,你可以在Github上的
    Gemfile
    中切换
    friebbly\u id
    ,然后将
    顺序插入的
    添加到模块列表中。

    id对我不起作用,因为在设置候选对象之前没有创建对象(有解决方法吗?)。我希望避免公开透露ID,但如果这是最好的解决方案,它会胜过使用UUID。我将它与
    globalize
    一起使用,也许这就是我有ID的原因。解决方法:创建后:清除slug并再次保存(ugh)?有没有更好的方法来代替这么长的slug?它并不比使用散列好多少,而且还显示了创建的时间(这可能不是您想要向最终用户显示的内容)。这已经发布,可以通过使用::sequential_slaged而不是:slaged来使用
    [ [:name], [:name, :id] ]
    
    # app/models/car.rb
    class Car < ActiveRecord::Base
      extend FriendlyId
      friendly_id :name, use: :slugged
    
      def normalize_friendly_id(string)
        incremented_number = (Time.now.to_f * 1000000).to_i
        "#{super}-#{incremented_number}"
      end
    end
    
    car1 = Car.create(name: "peugeot")
    car2 = Car.create(name: "peugeot")
    car3 = Car.create(name: "peugeot")
    
    car1.friendly_id #=> "peugeot-1451368076324115"
    car2.friendly_id #=> "peugeot-1451368076457560"
    car3.friendly_id #=> "peugeot-1451368076460087"