代码之家  ›  专栏  ›  技术社区  ›  craig

Ruby/Rails唯一名称生成器

  •  0
  • craig  · 技术社区  · 14 年前

    我有一个用户模型,它有许多文档。每个文档的标题在用户范围内必须是唯一的。这按预期工作。

    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将把“copy”附加到finder中复制的文档中。如果对象名称以“copy”结尾,它将添加一个递增的数值,从2开始(例如“foo copy 2”)。我想复制这种行为。

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

    1. 获取用户的文档集合
    2. 将标题提取到数组中
    3. 在数组中搜索新对象的标题
    4. 如果找不到标题,请保存对象
    5. 如果找到标题(可能是多个,如“foo copy”、“foo copy 2”),请在标题末尾附加“copy”或增加数字。regex模式“copy[0-9]*$”似乎找到了正确的匹配项。

    目前,复制逻辑在ResumeController中,但似乎更适合将其添加到文档模型中。

    感谢您的任何建议。

    2 回复  |  直到 14 年前
        1
  •  0
  •   Zachary Wright José Valim    14 年前

    与其拖拽整个文档列表并对其进行迭代,更好的方法是查找:

    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
    

    您可以将大部分逻辑转移到模型中,让您的控制器完全不知道需要或正在创建一个新名称。

        2
  •  0
  •   craig    14 年前

    我认为最简单的解决方案就是在文件名的末尾添加“copy yymmddhhmmss”,其中“yymmddhhmmss”替换为日期时间值。