如何检查表字段值的唯一性,如果不是uniq,则将其设为uniq

时间:2017-01-05 05:26:08

标签: ruby-on-rails ruby ruby-on-rails-4

为了让我的rails 4 app有虚荣网址,我有一个多态Slug表(id,url)。然后在我的文章模型中,我有以下内容来创建slug:

class Article < ActiveRecord::Base
  has_many :slugs, as: :sluggable, dependent: :destroy
  after_save :create_slug

  def create_slug
      return if !url_changed? || url == slugs.last.try(:url)
      #re-use old slugs
      previous = slugs.where('lower(url) = ?', url.downcase)
      previous.delete_all
      slugs.create!(url: url)
  end
end

@ article.url目前正在控制器中设置:

@article.url = @article.title.parameterize

除非存在冲突,否则此功能非常有效,这意味着正在使用已使用的标题创建文章。在这种情况下,导轨错误PG::UniqueViolation: ERROR: duplicate key value violates unique constraint

我认为我需要create_slug首先检查值是否存在,如果不存在则创建slug但是,如果值确实存在,则附加-1或-2等... url的结尾,直到url是唯一的。这听起来不错吗?处理/编码此方案的最佳方法是什么?

由于

1 个答案:

答案 0 :(得分:-1)

旧行为是在特殊module中实施的。但目前它还没有被释放。因此,如果要恢复旧行为,可以在Github上的Gemfile中切换friebdly_id,并将sequentially_slugged添加到模块列表中。

如果您不想移动任何宝石,那么最简单的方法是使用以下代码使网址更好....

def to_param
  "#{id}-#{slug}"
end

您可以更新方法代码并根据需要制作网址。