加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何为db字段创建顺序唯一ID

发布时间:2020-12-17 03:50:26 所属栏目:百科 来源:网络整理
导读:我有表Slug与字段url是独特的. 如果我创建@slug = Slug.url =“foo” 当我去保存时,如果“foo”的Slug.url已经存在,我想尝试一个“foo-1”的Slug.url如果它也存在,试试“foo-2”foo-3,foo -4等等……直到找到一个不存在且可以在db中创建的值…在我的rails模
我有表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模型

使用friendly_idsequentially_slugged模块,该模块在保存记录时(特别是在before_validation回调期间)从唯一列生成按顺序排序的段塞.

在新目录中启动一个新的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

全部完成!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读