ruby-on-rails – 如何为db字段创建顺序唯一ID
我有表Slug与字段url是独特的.
如果我创建@slug = Slug.url =“foo” 当我去保存时,如果“foo”的Slug.url已经存在,我想尝试一个“foo-1”的Slug.url如果它也存在,试试“foo-2”foo-3,foo -4等等……直到找到一个不存在且可以在db中创建的值…在我的rails模型中,这是什么样的正确方法? 谢谢 更新: 我的最新代码如下所示: def set_url self.url = self.title.parameterize # Ensure the url is available qUrl = self.url.split('-').shift slugs = Slug.where("url like '#{qUrl}%'") if slugs.exists? c = slugs.count + 1 self.url = self.url + "-" + c.to_s end end 这个代码的问题是qUrl正在拾取误报,任何时候标题都以“为什么”找到slugs这个词开头.在这里会有一些帮助,想出一些更可靠和优雅的东西.谢谢 解决方法
以下是包含多个模型的Rails项目的完整设置说明,所有模型都使用相同的Slug模型,并在根目录配置了slug-URL路由:
1. Slug模型 使用 在新目录中启动一个新的Rails项目: rails new . 将friendly_id添加到Gemfile(并在之后运行bundle install): gem 'friendly_id' 使用迁移(运行rake db:migrate after),db / migrate / 20170114211811_create_slugs.rb生成slugs表模式: class CreateSlugs < ActiveRecord::Migration def change create_table :slugs do |t| t.string :url t.string :title end add_index :slugs,:url,unique: true add_reference :slugs,:item,polymorphic: true,index: true end end 使用friendly_id,app / models / slug.rb创建一个Slug模型: class Slug < ActiveRecord::Base extend FriendlyId friendly_id :title,use: :sequentially_slugged,slug_column: :url belongs_to :item,polymorphic: true end 2. Slug路由控制器 您的用例要求单个根路由(例如,/ this-is-my-x). 配置/ routes.rb文件: Rails.application.routes.draw do get ':url' => 'slugs#show' end 要从此单个Slug路径中提供多个模型,您可以让Slug Controller将其渲染操作委派给与所选Slug关联模型相对应的View. 应用程序/控制器/ slugs_controller.rb: class SlugsController < ApplicationController def show @item = Slug.find_by(url: params[:url]) render "#{@item.item_type.pluralize.underscore}/show" end end 3. Sluggable模型视图 最后,开始使用多个模型中的单个Slug. 生成文章架构模型: rails generate model article title:string 应用程序/模型/ article.rb: class Article < ActiveRecord::Base has_one :slug,as: :item before_validation do if slug.try(:title) != title self.slug = Slug.create(title: title) end end end 应用程序/视图/文章/ show.html.erb: <h1>Articles#show</h1> <p>Title is <%=@item.title%>,ID is <%=@item.id%></p> 然后为博客,标签等创建更多模型视图. 4.测试 在rails控制台中创建一些文章: (1..10).each { Article.create title: 'foo' } 测试你的slug(运行rails服务器,并访问localhost:3000 / foo-7): Articles#show Title is foo,ID is 7 全部完成! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |