2012-07-27 53 views
0

我有一個Picture類,我想覆蓋返回「description」數據庫列值取決於某些邏輯。類方法vs數據庫字段的Rails優先

這在Rails中有效嗎?在返回數據庫列值之前,我是否總是可以依賴類來調用類方法?

# database columns for Picture class 
# description => String 
# parent_id => Integer 

class Picture < ActiveRecord::Base 

    def description 
    if parent_id.nil? 
     self.description  
    else 
     description = Picture.find(parent_id).description 
    end 
    end 

end 

找不到在哪裏可以找到答案的Rails源代碼,所以任何幫助,將不勝感激。

謝謝!

編輯

我試圖返回一個圖片的描述取決於它是否是一個孩子或父母圖片(它們可以被嵌套)。這個例子是有點做作......我可以很容易地通過使用方法不相同的名稱數據庫列避免這種情況...如

def my_description 
    if parent_id.nil? # return db data since no parent 
     self.description 
    else # return parent's description if one exists 
     description = Picture.find(parent_id).description 
    end 
end 

我想我想在這裏不必要的複雜

回答

2

這不是完全清楚你想要做什麼,但你可以用超級從方法中得到描述值:

def description 
    if parent_id.nil? 
    super 
    else 
    self.description = Picture.find(parent_id).description 
    end 
end 

注意,我改變了最後一行用self.description =因爲我假設你想設置描述值。如果情況並非如此,那麼您不需要將它分配給任何變量。

+0

我想返回一個圖片的描述取決於它是否是一個孩子或父母的圖片(他們可以嵌套)。這個例子是有點人爲的......我可以很容易地避免使用與數據庫列沒有相同名稱的方法...例如 def my_description if parent_id.nil? #返回DB數據,因爲沒有父 self.description如果存在 描述= Picture.find(PARENT_ID).DESCRIPTION 結束 結束 我想我想在這裏不必要的複雜 – 2012-07-27 04:58:43

+0

看到 其他#回報父母的描述在原始問題中編輯。試圖使用與數據庫列相同的名稱的方法,但這似乎只是使事情不必要地複雜化 – 2012-07-27 05:04:44

+0

您*可以*使用超級?我認爲Rails沒有定義屬性訪問器,如果已經定義了一個叫做相同的方法?只是在我自己的項目中嘗試過,看起來你是對的。酷:) – 2012-07-27 05:11:38

1

您應該在您的描述方法中使用read_attribute(:description)(可以覆蓋)。

此外,您可以在else部分中執行parent.description而不是Picture.find rigmarole。使用家長協會,我相信你有。

def description 
    # if parent_id is there and the parent object can be found and that parent has a description 
    if (parent_id? && parent && parent.description?) 
    # show parental description 
    parent.description 
    else 
    # read my own database attribute 
    read_attribute(:description) 
    end 
end 

不確定分配給上述說明是否會做任何事情,因爲它最終會成爲局部變量。而在讀者中做self.description =只是稍微令人討厭的恕我直言。

+0

很酷。看起來像read_attributes(:description)也與Beerlington提出的調用「super」的建議相同。謝謝您的幫助 – 2012-07-27 12:09:25