2011-05-06 76 views
10

我有一個我的數據庫表模型。我想覆蓋該特定表的列名稱。我將如何實現它。如何覆蓋Rails模型中的列?

例如,讓我的表稱爲模擬,它有一個名爲col_a

col_a 
20 
34 
42 
23 
12 

我會做一個@dummy.col_a一列。現在這個方法應該返回給我的結尾爲0的數字和其他所有的數字,它應該返回原始值。我可以通過定義一個新方法來實現,但我想重寫列名稱本身。請幫忙。

回答

22

您可以覆蓋col_a方法。使用read_attribute方法讀取數據庫中的值。類似這樣的:

def col_a 
    if self.read_attribute(:col_a).to_s.end_with?('0') 
    0 
    else 
    self.read_attribute(:col_a) 
    end 
end 
9

您可以簡單地定義一個與該列同名的方法。要獲取實際列值,請使用self [column_name]。所以,這樣的事情應該工作:

class Dummy < ActiveModel::Base 
    def col_a 
    self[:col_a] % 10 == 0 ? 0 : self[:col_a] 
    end 
end 

(假設爲col_a是一個整數)。

+0

,應該是'自我[:爲col_a]!%10 = 0? self [:col_a]:0'或'(self [:col_a]%10).zero? ? 0:self [:col_a]' – fl00r 2011-05-06 10:17:02

+0

是的 - 我假設0在這裏評估爲false,但它不。固定。 – Thilo 2011-05-06 10:20:37

4

可以實現通過overwriting default accessors如文檔中描述的。所有列值都可以通過Active Record對象上的基本訪問器自動獲得,但有時需要專門化這種行爲。這可以通過覆蓋默認訪問器(使用與屬性相同的名稱)並調用read_attribute(attr_name)write_attribute(attr_name, value)實際改變內容來完成。

滾動到覆蓋默認訪問器部分以獲取更多信息。

0

我有點遲到了這裏,但一個非常優雅的方式來做到這一點是簡單地使用super

​​