Ruby / Rails唯一名称生成器

时间:2010-08-03 02:34:09

标签: ruby-on-rails-3 clone

我有一个用户模型has_many Documents。每个文档的标题在用户范围内必须是唯一的。这可以按预期工作。

class Document < ActiveRecord::Base
  has_many :documents, :dependent => :delete_all
end

class Document < ActiveRecord::Base
  belongs_to :user
  validates_presence_of :title
  validates_uniqueness_of :title, :scope => :user_id
end

当我克隆文档时,我想确保其标题是唯一的。 OSX会将“复制”附加到在Finder中复制的文档中。如果对象的名称以'copy'结尾,它将添加一个递增的数值,从2开始(例如'foo copy 2')。我想重现这种行为。

似乎我需要在ResumeController的复制操作中执行以下操作:

  1. 获取用户的文档集
  2. 将标题提取到数组
  3. 在数组中搜索新对象的标题
  4. 如果找不到标题,请保存对象
  5. 如果找到标题(可能是多个,如'foo Copy','foo Copy 2'),请将'复制'添加到标题的末尾或增加数字。正则表达式模式'Copy [0-9] * $'似乎找到了正确的匹配。
  6. 目前,复制逻辑位于ResumeController中,但将它添加到Document模型似乎更合适。

    感谢任何建议。

2 个答案:

答案 0 :(得分:0)

不是拉动整个文档列表并迭代它们,更好的方法是进行查找:

def controller_method_name
  ...
  title = params[:title]
  d = Document.find(:first, :conditions => ["title = :title", {:title => title.strip}]

  if !d.nil?
    #your safe, no document with this title exists
  else
    #pass the title to the Document model and generate a new name
  end
  ...
end

您可能会将大部分逻辑移至模型中,并让您的控制器完全不知道需要或正在创建新名称。

答案 1 :(得分:0)

我认为最简单的解决方案就是将'复制YYYYMMDDHHMMSS'添加到文件名的末尾,其中'YYYYMMDDHHMMSS'被日期时间值替换。