2011-10-21 150 views
0

目前,我有我的分頁模型如下設置:/pages/6-about用戶友好的URL

class Page < ActiveRecord::Base 
    def to_param 
    "#{id}-#{permalink}" 
    end 
end 

我想的網址是/pages/about。什麼是最好的解決方案?提前致謝。

回答

0

關於你的問題沒有太多的信息。 有幾條途徑可以做到這一點,但這一切都取決於你在做什麼。

如果頁面數量是固定的,您可以保留一個靜態哈希表,記錄名稱< - > id。

private static readonly Dictionary<string, int> PagesDict = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase) { { "about", 6 }, { "home", 1 }, { "xxx", 2 } }; 

///<summary>Gets a page id by a string name. Returns -1 if page doesn't exists.</summary> 
public static int GetPageId(string name) 
{ 
    int result; 
    if (!PagesDict.TeyGetValue(name, out result)) 
     return -1; 
    return result; 
} 

如果你需要一個讀寫字典相反,你可以使用一個ConcurrentDictionary,但當然,這本詞典是不存儲,如果字典不是從東西裝像DB表或將丟失一個XML。

如果您的頁面是動態的並且從數據庫加載,那麼您需要在數據庫上有一個表格,該表格爲您提供了一個名稱。你可以通過名稱索引表,並且查詢應該很快。 如果你想減少對數據庫的訪問次數,你可以使用併發字典來實現一個(非常複雜的)緩存系統。

編輯 -

的信息來恢復ID必須大於或等於所需的量,信息量ID字段可存儲:)

我的意思是......

如果固定鏈接並不是唯一的,你無法從中獲得一個id。

如果永久鏈接字段是唯一的,它與ID相同,它是一個字符串ID。 然後,您可以編寫一個查詢,給定永久鏈接將返回給您一個ID。

如果你可以從一個獨特的幾個字段,例如,永久和fieldX恢復的ID,您可以編寫一個查詢,其中固定鏈接=「約」 AND fieldX =「XXX」

+0

嗨感謝您的快速響應。抱歉沒有添加額外的信息,我認爲它位於to_param的設置。 頁面內容來自DB 以下字段 - ID,標題,永久鏈接,主體 – user964900

1

所以你改變你的

def to_param 
    permalink 
end 

,然後實現一個

def self.from_param(value) 
    find_by_permalink(value) 
end 
在你的頁面模型

在你的控制器,你會再需要

def show 
    @page = Page.from_param(params[:id]) 
    ... 
end