2009-05-20 1 views
3

私は2つのモデル間に単純なhas_one/belongs_to関係を持っています。アクセスを試みるときに邪魔にならないように関連付けのレコードを作成しますか?

これはアプリケーション内の新しい関連付けであり、関連付けられたレコードがまだ作成されていないレコードが多数あります。

私のアプリケーション全体を通して、モデルには関連があり、その属性とメソッドにアクセスしていると仮定しています。しかし、関連が存在しないため、私は多くのエラーに遭遇しています。

私がやりたがっているのは、そのメソッドや属性を使って初めてア​​クセスしたときに、関連するレコードを邪魔にならないように構築することです。レコードにデータがあることは重要ではありません。私が呼んでいるメソッドがデータを構築できるように、データが存在するだけで済みます。

編集:私はidealyこれはどこでも私のコントローラでモデル自体に行われる必要はなく、チェックして、私は関係にアクセスしようとしているインスタンスのすべてのレコードを作成する必要はありません。

どのような考えですか?

ありがとうございます!コントローラで

答えて

1

は、ここでは、トリックをしたことになってしまったものです。私はそれを書いていませんでした(同僚でした)が、私はこのケースで書いた以前に失敗したテストに合格します。

def stats_with_create 
    stats_without_create || create_stats 
end 
alias_method_chain :stats, :create 
0

、あなたがテストされていない(show方法でこのようなものを入れることができますが、それはあなたのアイデアを与える必要があります。

@thing = Thing.find params[:id] 
if @thing.other_thing.nil? 
    @thing.other_thing = OtherThing.new.save! 
    @thing.save! 
end 

これは理想的ではない、とあなたはおそらくそれをクリーンアップすることができあなたのコントローラに入れずに関連モデルをチェックして作成するメソッドをThingモデルに入れてください。

もう1つの方法は、other_thingにアクセスするための新しいアクセサを作成し、必要。

ただし、マイグレーション中または直接的にデータを修正し、関連するモデルを適切に作成することが適切な場合があります。

+0

正しいですが、これは理想的ではありません。私はそれがアクセスされるとどこでもこれを行う必要があります。だからこそ、私はそれをモデルそのものや関係の中で行う必要があります。 – mwilliams

+0

私はもう少し詳細を追加しました。 –

0

直接的な回答は、関係のメソッドをオーバーライドすることです。呼び出されると、レコードが存在するかどうかをチェックし、レコードが存在しない場合はレコードを作成します。

ただし、すべてのレコードを前面に作成するには、移行を使用することをお勧めします。

0

私はモデルレベルではなく、前にこのタイプのことをしました。私はコントローラーレベルでbefore_filterを実行しました。before_filterは、モデルの関連付けにアクセスする必要があったすべてのメソッドの前に実行されていました。

モデルで使用できるafter_findコールバックとafter_initializeコールバックがあることがわかりました。

あなたが固執することができます:あなたのモデルに

def after_initialize 
    association.build if association.nil? 
end 

をし、それはあなたの問題を解決する必要があります。..(免責事項:私がテストされていない):)

関連する問題