2

考慮一個模型用戶:在Rails模型中「重載」一個字段的最佳方式是什麼?

User(id: integer, name: string, email: string, status: string) 

當我構建的應用程序,地位是在數據庫中的字段。但是新的需求意味着更改,以便在某些情況下動態計算狀態。例如,在星期日,如果他們的姓氏以A開頭,那麼他們的狀態是「不好」。

我想類似以下封裝在用戶模式這一功能:

Class User < ActiveRecord::Base 

    def status 
    if is_sunday && last_name.starts_with('A') 
     return 'not ok' 
    else 
     return status 
    end 
    end 

end 

什麼是做到這一點的最好方法是什麼?如果上面的代碼確實有效,那麼使用方法覆蓋數據庫中的字段似乎是不好的做法。

另外,我可以創建一個方法get_status使用上面的代碼。但在這種情況下,我需要在整個應用程序中更改對status的每個引用。這聽起來不太好。

+2

fwiw,我完全可以用這種方法作爲解決方案。我認爲添加'get_status'更令人困惑,因爲您有點創建第二種檢索用戶狀態的方法。 – thewillcole 2012-04-06 22:21:10

回答

4

我在ActiveRecord::Base documentation看到你可以覆蓋ActiveRecord提供的默認訪問器。當然,您不能像使用status那樣使用它,因爲它使該方法有些遞歸。

如果您願意,可以使用read_attribute(:attribute_name)self[:attribute_name]來訪問DB中的列值。所以長話短說,你的訪問者變爲:

Class User < ActiveRecord::Base 
    def status 
    if is_sunday && last_name.starts_with('A') 
     'not ok' 
    else 
     read_attribute(:status) 
    end 
    end 
end 

更新:我已經試過它和它的作品,但要注意,因爲如果你不調用這個方法,明確你的數據庫內容爲...例如,您嘗試查詢users表以找到具有status = "not ok"的用戶,您可能會有驚喜。

+1

在Rails 3.2上,''read_attribute(:status)'用'super'代替了嗎? – Zabba 2012-04-07 05:10:57

+0

'super'應該可以在之前的Rails版本中工作,因爲它是Ruby的關鍵,但在這種情況下,對我來說似乎有點模糊。我寧願明確表達這一點。 – 2012-04-07 15:39:03

+1

+1,是否需要返回聲明? – stephenmurdoch 2012-04-07 16:02:33

相關問題