2012-10-11 40 views
1

我目前爲我的模型動態生成url slugs(並實現to_param/self.from_param來解釋它們)。我的slu generation代代碼感覺冗長,可以使用重構。重構:爲模型生成一個獨特的slu 012

你會如何重構這個,使它仍然可讀,但不那麼冗長,也許更清楚?

關係

用戶的has_many:列出

列表 belongs_to的:所有者

代碼

def generate_slug 
    if self.owner 
    slug_found = false 
    count  = 0 
    temp_slug = to_slug 

    until slug_found 
     # increment the count 
     count += 1 

     # create a potential slug 
     temp_slug = if count > 1 
     suffix = "_" + count.to_s 
     to_slug + suffix 
     else 
     to_slug 
     end 

     # fetch an existing slug for this list's owner's lists 
     # (i.e. owner has many lists and list slugs should be unique per owner) 
     existing = self.owner.lists.from_param(temp_slug) 

     # if it doesn't exist, or it exists but is the current list, slug found! 
     if existing.nil? or (existing == self) 
     slug_found = true 
     end 
    end 

    # set the slug 
    self.slug = temp_slug 
    else 
    Rails.logger.debug "List (id: #{self.id}, slug: #{self.slug}) doesn't have an owner set!" 
    end 
end 

回答

1

你也許可以這樣做

def generate_slug 
    return Rails.logger.debug "List (id: #{self.id}, slug: #{self.slug}) doesn't have an owner set!" if !self.owner 

    count = 1 
    begin 
    temp_slug = %Q!#{to_slug}#{"_#{count}" if count > 1}! 
    existing = self.owner.lists.from_param(temp_slug) 

    if existing.nil? or (existing == self) 
     self.slug = temp_slug 
    end 
    end while count += 1 
end 

但有兩件事。首先你有一個不好的循環。其次,不是每次循環檢查對象是否存在以及是否需要增加後綴,最好獲取最後一個現有列表並在其後添加一個。

+0

剛剛獲得最後一個存在的問題是,如果刪除了一個(因爲內容可由用戶基礎刪除),則存在差距。在我看來,如果有人創建了第一個,使用相同的名稱(因此將_2附加到slug),但是隨後刪除了第一個,現在沒有後綴的slug不可用。 –

+0

我不認爲這是不好的差距。也許你可以依靠其他參數來確定它是最後一個參數。 – oldergod

+0

你可能會建議什麼? –