2011-10-10 30 views
12

我必須連接到我們的freeradius服務器使用的現有數據庫。一個表有一個名爲屬性的列,我嘗試訪問。ActiveRecord :: DangerousAttributeError

訪問時,我得到了自己的錯誤:

ActiveRecord::DangerousAttributeError 
attribute? is defined by ActiveRecord 

我試着選擇和我的模型重命名此列:

def self.default_scope 
    Radcheck.select("attribute as newattribute") 
end 

但是,這不是工作要麼。

任何人都可以推薦一個解決這個問題的方法嗎?我真的很想重命名欄中的列!

回答

2

我從來沒有碰到這樣的情況,但我認爲這應該工作

class Radcheck < ActiveRecord::Base 
    default_scope :select=> 'attribute as newattribute' 
end 

您應該使用實例方法default_scope不是階級一個

你也有一個選項,使用實例方法,如:

RadCheck.read_attribute :attribute 

希望它可以幫助

+0

謝謝 - 我已經試過這一點,我仍然得到抨擊錯誤。我是否也需要改變我的控制器操作?目前我有這個:@radcheck = Radcheck.all謝謝 –

+0

沒有在AR4中工作 –

10

在Si milar問題,我發現了這樣的回答:https://stackoverflow.com/a/9106597/1266906

而不必關心哪些屬性通過的ActiveRecord在Rails的3.0保留只需添加

gem 'safe_attributes' 

Gemfile和創業板會盡量採取一切碰撞名護理自動。

至於其他的答案,你需要使用Radcheck[:attribute]Radcheck.read_attribute :attribute/Radcheck.write_attribute :attribute, 'value'訪問與內部保留名稱的字段,但創業板,能夠保證象validates_presence_of :attribute驗證將照常上班。

更多詳細信息,請https://github.com/bjones/safe_attributes

+1

我遇到了同樣的問題,在我的遺留數據庫中有效的屬性。使用「safe_attributes」確實可以開箱即用。 – dhenze

+2

給Google員工一個提示:這個寶石几乎適用於任何保留字*,但*屬性爲*。從自述:「使用ActiveRecord時,在模式中實際上不可能有名爲'attribute'的列。」 –

+0

如果還使用Hirb,則可能需要先禁用,然後才能使用Hirb.disable在控制檯中呈現模型列。 –

0

這是確實需要改變外部數據庫的解決方案,但它是一個很小的變化,它會與任何列名甚至`attribute`工作。沒有必要的寶石。

在外部/舊版數據庫中創建一個重命名有問題的列的視圖。例如

CREATE VIEW radcheck_view AS (
    SELECT id, username, op, value, attribute rad_attribute 
    FROM radcheck 
); 

這裏的問題列被重命名attributerad_attribute

不要忘記在視圖上授予適當的權限。在我的情況下,它是隻讀的用法:

GRANT SHOW VIEW ON radius.radcheck_view TO <rails_user> IDENTIFIED BY '<password>'; 

然後,在你的軌道模型中使用視圖table_name

class RadiusRadcheck < RadiusExternal 
    self.table_name = 'radcheck_view' 
end 
相關問題