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,它是一个数字序列,那么我提出了解决您的问题/顾虑的方法:
注意:的数字是递增的 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"