ActiveRecord的更好,非数字和非顺序ID

时间:2014-07-27 00:56:54

标签: ruby-on-rails ruby activerecord models

我在我的Rails 4.1.1应用程序中使用ActiveRecord并且我在数据库中持久保存对象,但我真的不喜欢分配给我的对象(1,2,3等等)的ID我想要的这些id是非整数和非顺序的,就像MongoId gem一样。

我该怎么做?

1 个答案:

答案 0 :(得分:2)

我假设您想要进行此更改,因为您不喜欢这些ID在网址中的曝光...

http://my_application.com/posts/3.html

没有其他理由可以改变ID ......他们完成了他们应该做的工作,他们在应用程序内部(除了上述情况之外)。

您可能想要考虑的技术是使用" slugs"

在您的模型中创建一个名为slug的属性,该属性可能是您的模型" title"或"名称"但是以友好的网址格式...在before_save操作中自动创建

class Post < ActiveRecord::Base
  before_save :create_slug

  def create_slug
    #strip the string
    slug = title.strip

    #blow away apostrophes
    slug.gsub! /['`]/,""

    # @ --> at, and & --> and
    slug.gsub! /\s*@\s*/, " at "
    slug.gsub! /\s*&\s*/, " and "

    #replace all non alphanumeric, underscore or periods with underscore
     slug.gsub! /\s*[^A-Za-z0-9\.\-]\s*/, '_'  

     #convert double underscores to single
     slug.gsub! /_+/,"_"

     #strip off leading/trailing underscore
     slug.gsub! /\A[_\.]+|[_\.]+\z/,""

     #make sure the slug is unique...
     unique = false
     appendix = ""
     counter = 0
     until unique
       test_slug = slug + appendix
       test_object = self.class.find_by_slug(test_slug)
       unique = true unless test_object && test_object != self
       counter += 1
       appendix = "_#{counter}"
     end

     self.slug = test_slug
  end
end
然后创建一个&#39; to_param&#39;你班上的方法...这将创建&#34; user_friendly&#34;将显示在网址中的ID

def to_param
  slug
end

最后,您需要更换&#34; find&#34; &#34; find_by_slug&#34;的方法(以便它搜索slug,而不是原始id)

@post = Post.find_by_slug(params[:id])

这一切都会给你一个更好的网址......

http://my_application.com/posts/my_post_about_flowers.html

这是关于段塞的一个很好的参考 http://blog.teamtreehouse.com/creating-vanity-urls-in-rails

我展示的slug方法改编自这篇SO帖子......

Best way to generate slugs (human-readable IDs) in Rails