2010-04-15 53 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中使用该字段。

相关问题