2009-10-02 44 views
14

我正在訪問一個我無法更改的數據庫,它有一個名爲的有效的列已定義。任何時候我嘗試訪問一個屬性,我得到這個例外:如何在具有名爲'valid'的列的數據庫上使用ActiveRecord? (DangerousAttributeError)

有效嗎?由ActiveRecord的 (ActiveRecord的:: DangerousAttributeError)

唯一的例外是有道理的,但因爲我不能更改數據庫,我怎麼能解決這個錯誤得到界定?

我試過「重寫」的屬性,但我不知道如何刪除原始列。我可以成功調用這個valid_column方法,但是當我嘗試訪問數據庫中定義的另一個屬性時,我會得到相同的異常。它似乎仍然試圖映射有效的列。

def valid_column=(valid) 
    write_attribute(:valid, valid) 
    end 
    def valid_column 
     read_attribute(:valid) 
    end 

我不知道,如果它很重要,但這裏是我的環境的詳細信息:

  • 的Windows的Ruby 1.8.6
  • Linux服務器
  • 的ActiveRecord上
  • Informix數據庫( 2.3.4)
  • activerecord-informix-adapter(1.0.0.9250)
  • ruby​​-informix(0.7.1)

在此先感謝!

回答

11

試試這個:

class MyTable < AR:Base 
    class << self 
    def instance_method_already_implemented?(method_name) 
     return true if method_name == 'valid' 
     super 
    end 
    end 
end 

這是一個黑客,它可能不會在軌道3個工作,但它可以解決這個問題現在。

,我發現它的ruby on rails mailing list

如果你願意,你也可以看看datamapper,這在一定程度以上三立處理這些類的東西。

+1

您可能需要更改'如果METHOD_NAME ==返回true「valid''到'返回true,如果METHOD_NAME == '有效嗎?''爲了得到它的工作。我做到了。 – 2012-12-04 16:42:08

+0

問題標記似乎需要在rails 3中。 – Kelvin 2013-07-16 20:21:52

3

對於讀取,您可能可以使用SQL的select-as語句。不確定以下內容是否可行,但默認範圍可能會使此功能變得容易實現。

class MyRecord < ActiveRecord::Base 
    default_scope :select=> 'valid as valid_column' 
end 
3

無需擔心的ActiveRecord的保留屬性,只需添加一個寶石在你的Gemfile和創業板將自動完成名稱衝突的。

gem 'safe_attributes' 

http://goo.gl/OO2H7

+0

如果該對象已經創建,該怎麼辦?在嘗試訪問myobj.association時,我的對象出現錯誤。該對象是在將gem添加到我的gemfile之前創建的。謝謝。 – daveomcd 2013-06-02 17:09:20

相關問題