2010-08-03 78 views
0

我有一個用戶模型has_many文檔。每個文檔的標題在用戶範圍內必須是唯一的。這按預期工作。Ruby/Rails獨特的名字生成器

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'附加到標題或incr表示數字。正則表達式模式'Copy [0-9] * $'似乎找到了正確的匹配。

此刻,複製邏輯位於ResumeController中,但將其添加到Document模型似乎更合適。

任何意見表示讚賞。

回答

0

我決定最簡單的解決方案就是將'YYYYMMDDHHMMSS'複製到文件名的末尾,其中'YYYYMMDDHHMMSS'被日期時間值替換。

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 

你也許可以移動大多數邏輯的模型,並有你的控制器完全不知道一個新的名字需要或正在創建。

+0

做一個發現肯定會有所幫助。但是,這並沒有解決主要問題。你有什麼想法嗎? – craig 2010-08-03 12:19:41