1

我正在为after_create回调中的 Posts 创建一个 slug,如果 slug 已经存在,我不确定如何在末尾附加一个数字。

class Post < ActiveRecord::Base
  attr_accessible :body, :title, :slug
  after_create :create_slug
  validates_uniqueness_of :slug

  def create_slug
    existing = Post.where("slug LIKE ?", "#{title.parameterize}%").length
    existing > 0 ? slug = "#{title.parameterize}-#{existing+1}" : slug = title.parameterize
    self.update_attributes(slug: slug)
  end
end

这不起作用,因为我的where子句匹配标题为“某些不同的标题”的帖子,例如。

一种解决方案是追加post.id而不是尝试枚举。如果帖子被删除,这也可能会更好。但我不希望删除任何帖子,而且不使用 ID 似乎更有意义。

有什么建议吗?

4

1 回答 1

1

Post.where(title: title).count

在你的情况下给你正确的号码?

对数据库中的 slug 列设置唯一约束也很重要,因为如果在相似时间创建具有相同标题的两个帖子,则此算法会受到竞争条件的影响。Rails 本身不能保证列的唯一性。

于 2013-04-09T22:31:56.420 回答