2

私が持っているとしましょう:

class Foo < ActiveRecord::Base
  has_many :bar
end

class Bar < ActiveRecord::Base
  belongs_to :foo
end

Barまた、クラスにタイムスタンプ フィールド (レコードが更新されると自動的に更新されるフィールド) があると仮定します。

質問: Rails、ActiveRecord、またはどこかに既存の機能/メソッド呼び出しがあり、クラスupdated_atで定義された関連付けのいずれかで、任意のレコードの列の最新の値を教えてくれるメソッドを呼び出すことができますか? Foo?

したがって、理論的なfoo.latest_change_to_associated_objects方法では、最新のupdated_atフィールドが関連付けられているレコード (この場合は任意のBarレコード) のタイムスタンプを取得する必要があります。

親クラスがあり、1 つの関連付けだけで十分単純な最も単純なケース - 1 つまたは 2 つのコールバックでうまくいきます。クラスに多くの関連付けが定義されている状況に興味があります。この機能を持つアソシエーションの一部またはすべてを宣言できる宝石 (または ActiveRecord 内に既に存在する機能) はありますか?

明らかに、これを把握するために SQL 呼び出しを実行できますが、最新の変更を確認するたびに SQL 呼び出しを実行したくはありません。latest_change_on_association関連するレコードが変更されたときに、親のフィールド (またはそれを呼び出したいもの) を自動的に更新するコールバック チェーンが必要なようです。最新の変更タイムスタンプを取得するには、親レコード。

注: http://api.rubyonrails.org/classes/ActiveModel/Observer.htmlを調べましたが、クラスごとにオブザーバーを作成する必要があるという問題がありました。アソシエーションのリストからオブザーバーを作成する自動化が、gem か何かで既にラップされていれば素晴らしいことです。

4

2 に答える 2

2

関連するレコードの 1 つが変更されたときに、 の親レコードのタイムスタンプ (またはその他のタイムスタンプ フィールド:touch)を自動的に更新するために使用できます。updated_atbelongs_to

強調は私のものです:

:接する

true の場合、このレコードが保存または破棄されたときに、関連付けられたオブジェクトが変更されます (updated_at/on 属性が現在に設定されます)。シンボルを指定すると、updated_at/on 属性に加えて、その属性が現在の時刻で更新されます。

本当に列を使用したい場合はlast_association_updated_at、次のことができます。

belongs_to :parent_class, :touch => :last_association_updated_at

関連付けに関する Rails ガイドを参照してください。

于 2012-05-10T15:04:23.753 に答える
1

最新の変更のタイムスタンプを保持する親クラスのテーブルに列を追加することをお勧めします。列を「last_association_updated_at」と呼びましょう。次に、:touch各子クラスの関連付けでオプションを使用します。子レコードが作成、変更、または削除されるたびに、last_association_updated_at列は現在の時刻で更新されます。

class Foo < ActiveRecord::Base
  has_many :bar
end

class Bar < ActiveRecord::Base
  belongs_to :foo, :touch => :last_association_updated_at
end

class Baz < ActiveRecord::Base
  belongs_to :foo, :touch => :last_association_updated_at
end
于 2012-05-10T15:00:16.420 に答える