我在我的Rails 4.1.1应用程序中使用ActiveRecord并且我在数据库中持久保存对象,但我真的不喜欢分配给我的对象(1,2,3等等)的ID我想要的这些id是非整数和非顺序的,就像MongoId gem一样。
我该怎么做?
答案 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帖子......