使用数字序列复制S [[友情ID]

时间:2015-12-19 11:29:52

标签: ruby-on-rails friendly-id

我在docs注意到:Previous versions of FriendlyId appended a numeric sequence to make slugs unique, but this was removed to simplify using FriendlyId in concurrent code.

有没有办法恢复到这种格式?我的模型只有name所以没有任何其他可行的子弹候选者(timedate在这种情况下对于slug候选者没有意义。)< / p>

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

car.friendly_id #=> "peugeot-206"
car2.friendly_id #=> "peugeot-206-f9f3789a-daec-4156-af1d-fab81aa16ee5"
car3.friendly_id #=> "peugeot-206-f9dsafad-eamj-2091-a3de-fabsafafdsa5"

进入这个:

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

2 个答案:

答案 0 :(得分:2)

旧行为是在特殊module中实施的。但目前它还没有被释放。因此,如果要恢复旧行为,可以在Github上的friebdly_id中切换Gemfile,并将sequentially_slugged添加到模块列表中。

答案 1 :(得分:1)

我意识到你说过

  

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

但是假设你只是指时间的字符串格式而不是unix这是一个数字序列,那么我想出了这个解决方法来解决你的问题/关注:

  1. 您的模型只有名称属性
  2. 你不能使用id附加到slug,因为它尚未创建
  3. 您希望slu is是uniq和递增
  4. 您不想使用UUID
  5. # 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"
    
      

    注意:数字 递增

         

    Time.now.to_f * 1000将是毫秒,而我正在使用    Time.now.to_f * 1000000是MICROSECONDS &lt; - 这是百万分之一秒。它将 NOT 同时创建,因此不会遇到slug冲突。如果那里有人认为它可以再添加一些零到这个乘数。