3

2つのモデル間に単純なhas_one/belongs_to関係があります。

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

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

私がやりたいのは、メソッドと属性のいずれかを介して初めてア​​クセスするときはいつでも、関連するレコードをその場で目立たないように構築することです。レコードにデータがあるかどうかは関係ありません。呼び出しているメソッドがデータを作成できるように、データが存在している必要があります。

編集:リレーションシップにアクセスしようとしているすべてのインスタンスでレコードをチェックして作成したくないので、理想的には、これはモデル自体で実行する必要があり、コントローラーでは実行しないでください。

何かご意見は?

ありがとう!

4

4 に答える 4

1

これが私たちが最終的にうまくいったことです。私はそれを書きませんでした(同僚が書きました)が、それは私がこのケースのために書いた以前に失敗したテストに合格します。

def stats_with_create
  stats_without_create || create_stats
end
alias_method_chain :stats, :create
于 2009-05-20T20:17:30.500 に答える
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作成し、必要に応じて作成することです。

ただし、正しい方法は、移行または直接のいずれかでデータを修正し、関連するモデルを適切に作成することです。

于 2009-05-20T18:35:50.363 に答える
0

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

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

于 2009-05-20T19:05:36.963 に答える
0

私は以前にこの種のことをしましたが、モデルレベルではしていません。まだ存在していない、またはまだ存在していないモデルの関連付けにアクセスする必要があるすべてのメソッドの前に実行されるbefore_filterを使用して、コントローラーレベルでそれを実行しました。

モデルで使用できるafter_findコールバックとafter_initializeコールバックがあることに気づきました。

あなたは固執することができます:

def after_initialize
   association.build if association.nil?
end

あなたのモデルでそしてそれはあなたの問題を解決するはずです..(免責事項:私によってテストされていません):)

于 2009-05-20T19:12:45.780 に答える