我有一个用户模型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的复制操作中执行以下操作:
目前,复制逻辑位于ResumeController中,但将它添加到Document模型似乎更合适。
感谢任何建议。
答案 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'被日期时间值替换。