2009-02-04 50 views
1

我有與像一羣白癡命名的列的舊的數據庫:Rails ActiveRecord:自動別名/追加後綴?

some_field_c 
some_other_field_c 
a_third_field_c

我很想做一個Rails的ActiveRecord子類,自動別名這些屬性,以他們的名字去掉下劃線和「C」。然而,當我嘗試:

attributes.each_key do | key | 
    name = key 
    alias_attribute key.to_sym, key[0, (key.length -2)].to_sym if key =~ /_c$/ 
end 
在我的類定義

我得到了一個「未定義的局部變量或方法'屬性」的錯誤。我也嘗試覆蓋這些方法:

method_missing 
respond_to?

但我一直收到錯誤的路線了。

所以我的問題(實際上的問題)是/是:

  1. 正是我試圖做甚至可能嗎?
  2. 如果是這樣,那麼最好的方法是什麼(迭代混疊或覆蓋方法丟失)?
  3. 如果沒有太多的麻煩,一個非常簡短的如何做#2的代碼示例會很棒。

在此先感謝您收到的任何答案。

+0

你可以發佈一個完整的例子,這應該是很容易獲得工作 – 2009-02-04 01:48:56

回答

2

你的問題可能是attributes是一個實例方法,你在類的上下文中這樣做。與你想要的最接近的類方法是column_names

+0

它的工作,謝謝!我確實必須將代碼放入子類調用的方法才能使其正常工作,如果您有某種方式可以說「在此子類之後運行此重新別名代碼,創建類屬性創建「,但*聳肩*哦。再次感謝! – machineghost 2009-02-04 21:35:12

+0

我試圖在這裏粘貼我的工作代碼,但是註釋格式毀了它:-(然而,它基本上與我的問題中的代碼相同,除了「column_names」而不是「attributes」,並且沒有「name = key 「(該行是垃圾),都在一個由子類調用方法定義的。 – machineghost 2009-02-04 21:43:41

1

,你可以這樣做:

methods.each do |method| 
    if method.ends_with("_c") then 
    self.send(:defind_method,method.slice(0,-2)){self.send(method)} 
    end 
end 
1

嗯...我熟了,我以爲結束了漂亮高雅的這個小解決方案...

不知道這是否會工作,但我走樣的method_missing仍然允許active_record做的勝:

module ShittyDatabaseMethods 
    alias :old_method_missing :method_missing 

    def method_missing(method) 
    if methods.include?("#{method}_c") 
     send("#{method}_c".to_sym) 
    else 
     old_method_missing(method) 
    end 
    end 

end 

class Test 
    attr_accessor :test_c 
    include ShittyDatabaseMethods 
end 

您可能沒有獲得命名你的模塊「ShittyDatabaseMethods」,但你的想法;)一旦你定義模塊和東西我牛逼到lib中,你只需要包含此模塊和您去:d

很想聽到這是否爲你:)