Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.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 如何创建一个基于数据库中记录的最少位数的url链接缩短器slug_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 如何创建一个基于数据库中记录的最少位数的url链接缩短器slug

Ruby on rails 如何创建一个基于数据库中记录的最少位数的url链接缩短器slug,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正试图找出一种算法来生成一个链接缩短器slug(即,仅是键,而不是整个短url),它将根据数据库中提交的链接数量,在tablelink上尽可能短 我做了几个假设: 1-根据标准字符和未保留的RFC3986字符,我可以在base 66系统中工作(26+26+10+'-'、''''.'、'.'、'~') 2-此case语句是处理输出链接段塞设置数字大小的最佳方法。我以为会有一个更优雅的方法来做这件事,但这是我能想到的最好的方法 def self.slug_characters(slug_dig

我正试图找出一种算法来生成一个链接缩短器slug(即,仅是键,而不是整个短url),它将根据数据库中提交的链接数量,在table
link
上尽可能短

我做了几个假设:

1-根据标准字符和未保留的RFC3986字符,我可以在base 66系统中工作(26+26+10+
'-'、''''.'、'.'、'~'

2-此case语句是处理输出链接段塞设置数字大小的最佳方法。我以为会有一个更优雅的方法来做这件事,但这是我能想到的最好的方法

  def self.slug_characters(slug_digits)
    alphanumcase = [('a'..'z'), ('A'..'Z'), ('0'..'9')].map(&:to_a).flatten
    unreserved = ['-', '_', '.', '~']
    # unreserved = the balance of the RFC 3986 unreserved character set
    characters = [alphanumcase, unreserved].map(&:to_a).flatten
    (0...slug_digits).map { characters[rand(characters.length)] }.join
  end

  def self.generate_slug
    case Link.count
    when 0..66**1
      digits = 1
    when (66**1+1)..66**2
      digits = 2
    when (66**2+1)..66**3
      digits = 3
    when (66**3+1)..66**4
      digits = 5
    when (66**4+1)..66**5
      digits = 6
    when (66**5+1)..66**6
      digits = 7
    end

    self.slug_characters(digits)
  end
end
我在寻找一些关于url中什么是允许的知识,因为从我所能研究的内容来看,我的理解有些模糊


另外,根据我提供的代码,我希望有一种更优雅的方法来生成段塞数字计数。

对于段塞数字计数,您基本上是在寻找数字在基数66中的长度。这与计算基数66中数字的对数有关:1的基数66对数(基数66中的1位数字)为0,66的基数66对数(基数66中的2位数字)为1,66^2的基数对数(基数66中的3位数字)为2,等等。因此
(Math.log(Link.count,66)+1)。floor
应该给出您要查找的数字


请注意,如果你的
Link.count
为0,你会遇到问题,但不清楚你是否会在这种情况下运行它。

对于slug digits count,你基本上是在寻找你的数字在基数66中的时间。这与计算基数66中数字的对数有关:1的基数66对数(基数66中的1位数字)为0,66的基数66对数(基数66中的2位数字)为1,66^2的基数对数(基数66中的3位数字)为2,等等。因此
(Math.log(Link.count,66)+1)。floor
应该给出您要查找的数字

请注意,如果
Link.count
为0,您将遇到问题,但不清楚您是否会在这种情况下运行它