2011-01-11 13 views
0

私は、同じオブジェクトの3つの子インスタンスを構成しているデータオブジェクトを持っています。そのオブジェクトから値を計算し、それをデータベースに保存する必要があります。 (後で別のアプリケーションによってデータベースから引き出されます。)派生したActiveRecord値を計算して保存する方法

私は下のクラス構造を模倣しましたが、基本的には、子値data_oneとdata_twoをまとめて3番目の変数に格納するメソッドが必要です、合計。私が推測するのは、db Parentテーブルのtotal_first、total_second、total_thirdです。合計をChild属性として宣言し、コールバックを使用して設定する必要がありますか?どんな助けでも大歓迎です - ありがとう!そして、これは本当に明白な疑問であれば謝罪...

class Child 

    attr_reader :data_one, :data_two 

    def initialize(data_one, data_two) 
    @data_one, @data_two, 
    end 

    def ==(other_child) 
    data_one   == other_child.data_one   && 
    data_two   == other_child.data_two    
    end 

    def Sdq.from_params(hash) 
    Sdq.new(
     get_value(hash, :data_one), 
     get_value(hash, :data_two), 
    ) 
    end 

    protected 
    def Sdq.get_value(hash, key) 
     hash.has_key?(key) ? hash[key] : hash[key.to_s] 
    end 
end 


class Parent < ActiveRecord::Base 

    composed_of :first_child, :class_name => "Child", :mapping => [ 
    ["data_one_first","data_one"], 
    ["data_two_first","data_two"] 
    ] 

    composed_of :second_child, :class_name => "Child", :mapping => [ 
    ["data_one_second","data_one"], 
    ["data_two_second","data_two"] 
    ] 

    composed_of :third_child, :class_name => "Child", :mapping => [ 
    ["data_one_third","data_one"], 
    ["data_two_third","data_two"] 
    ] 

end 

答えて

2

親は常に正確に2人の子供を持つことになりますなぜ私は想像できない、なぜmany_to_x関係?あなたが多くを必要とするかどうかに応じて。うまくいけば、この例は見えません。

理由がある必要があります。

説明したようにコールバックを使用します。たぶんbefore_validationsとそれにいくつかの検証があります。コールバックで真ではない値を返すと、レコードにならないことに注意してください。

E.G条件がfalseの場合、このメソッドはnilを返し、セーブコールバックチェーンを停止できます。

def before_save 
    if something_sometimes_is_false 
     #do normal code 
    end # could not run, which would return nil and break things 
end 

最後に自己を返すことを検討してください。

+0

ありがとう、モデルを充実させるように関係が設定されています - フィールドは親テーブルに格納されていますが、子オブジェクトを使用して追加メソッドを呼び出すことができます。それはかなり面倒なようですが、私はそれを行うための別の方法があるかどうか分からないのですか?あなたの例では、私は子オブジェクトの値を設定する必要がありますか? Parentテーブルを自動的に更新しますか?どうもありがとう! – laura

+0

@lainie Parentのインスタンスでsaveを呼び出すと、親テーブルが更新されます。あなたのマッピングが正確であれば、彼らがいない場合は、あなたに何が起こっているかを知らせる例外を得るでしょう。 – EnabrenTane

+0

ありがとうございます。 – laura

関連する問題