2010-04-15 71 views
0

儘管它不是我的應用程序,但是解釋我的問題的一種簡單方法是假定我正在運行URL縮短器。我不是試圖弄清楚下一個字符串應該用作URL的唯一部分,我只是用整數索引我的所有URL,並將數字映射到幕後的字符串,基本上只是將數字的基數更改爲,比方說,62:az + AZ + 0-9。Ruby&ActiveRecord:通過(唯一映射的)字符串引用整數字段

在ActiveRecord的,我可以很容易地改變了url_id領域的讀者,使其返回我的基地62字符串而不是數被存儲在數據庫中:

class Short < ActiveRecord::Base 
    def url_id 
    i = read_attribute(:convo) 

    return '0' if i == 0 
    s = '' 
    while i > 0 
     s << CHARS[i.modulo(62)] 
     i /= 62 
    end 
    s 
    end 
end 

有沒有辦法告訴ActiveRecord接受Short.find(:first,:conditions=>{:url_id=>'Ab7'}),即。把'解碼'邏輯放到我的Short ActiveRecord類中?

我想我可以定義我自己的def self.find_by_unique_string(string),但那感覺就像是在作弊!謝謝!

+0

有點讓我覺得我需要使用'before_find' - 關於正確的聲音?這個回調是否存在? – 2010-04-15 23:23:26

+0

爲什麼定義你自己的方法就像是作弊?這就是所謂的編程。你似乎尋找的解決方案可能需要猴子修補ActiveRecord,這應該更像是作弊。 – ehsanul 2010-04-16 01:06:24

+0

ActiveRecord是我認爲他們已經爲此計劃的一個深思熟慮的圖書館:P聽起來像你有最好的主意壽! – 2010-04-16 08:29:01

回答

0

另一種替代方法是在數據庫表中爲unique_string實際添加一個額外字段,然後使用回調將編碼值放入此字段中。然後,保存記錄後,您將可以在任何種類的find中使用該字段。

相關問題