2012-02-01 47 views
5

我的折扣類具有sales_period。我想寫一個方法,當它不存在時可以建立這種關聯,或者當它存在時更新它。目前我正在撰寫以下條件。建立has_one關聯或更新(如果存在)的更好方法

class Discount < ActiveRecord::Base 
    has_one :sales_period 

    def fetch_period 
    end_date = ... 
    if sales_period.nil? 
     build_sales_period(end: end_date) 
    else 
     sales_period.end = end_date 
    end 
    end 
end 

有沒有更好的方法來做到這一點,類似於find_or_create

回答

10

不是你想要什麼,但你可以稍微縮短它。

def fetch_period 
    end_date = ... 
    period = sales_period || build_sales_period 
    period.end = end_date 
end 
+0

謝謝,它稍微好一點,我認爲這是最好的。 – lulalala 2012-02-01 05:34:44

+0

是的,這取決於fetch_period方法實際做了什麼,但如果你在多個地方使用它,我會考慮將那一行邏輯移動到它自己的方法 – 2012-02-01 08:05:21

0

find_or_initializefirst_or_initialize相似。例如:

def fetch_period 
    end_date = ... 
    sales_period.find_or_initialize_by_end(end_date) 
end 

而且,我會重新命名end,這是一個紅寶石關鍵字。當某些東西試圖使用代碼或某些東西時,你可能會得到一些奇怪的錯誤,而且這會讓人感到非常困惑。

+0

似乎當end_date更改時,如果sales_period已存在,它將創建一個新記錄並保留一個孤立的sales_period。即它不更新現有的銷售期限結束日期 – lulalala 2012-02-01 03:58:14

+0

您是對的,我錯誤地閱讀了您要做的事情。我會說布拉德利的回答是正確的。 – Woahdae 2012-02-01 04:27:45

+1

也許'sales_period.find_or_create_by_discount_id(id).update_attributes(end:end_date)' – Woahdae 2012-02-01 04:29:30