2012-02-01 48 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