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

+0

ええ、それは実際にfetch_periodメソッドが何をするかによって異なりますが、複数の場所でそれを使用しているなら、ロジックの1行を独自のメソッドに移動することを検討したいと思います –

0

find_or_initializeは、first_or_initializeと同様です。例:

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

また、私はそれがRubyのキーワードだ、endの名前を変更したいです。何かがevalコードやそのようなものを試してみると、おそらく奇妙なバグが出てきます。それは非常に混乱します。

+0

end_dateが変更された場合、sales_periodが既に存在する場合は、新しいレコードが作成され、孤立したsales_periodのままになります。つまり、既存の販売期間の終了日を更新しません。 – lulalala

+0

あなたが正しいです、私はあなたがしようとしていることを間違って読んでいます。私はブラッドリーの答えが正しいと言うだろう。 – Woahdae

+1

おそらく 'sales_period.find_or_create_by_discount_id(id).update_attributes(end:end_date)' – Woahdae

関連する問題