【问题标题】:Ruby/Rails unique name generatorRuby/Rails 唯一名称生成器
【发布时间】:2010-08-03 02:34:09
【问题描述】:

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

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'附加到标题的末尾或增加数字。正则表达式模式 'Copy[ 0-9]*$' 似乎找到了正确的匹配项。

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

感谢任何建议。

【问题讨论】:

    标签: ruby-on-rails-3 clone


    【解决方案1】:

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

    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】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      • 2012-05-16
      • 2012-04-24
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多