2016-05-23 14 views
0

内にhas_manyは私がCommentモデルとRailsアプリケーションを持って、それぞれのコメントhas_many :notificationsのRails:タイムフレーム

が、私はこのhas_many関係にdependent: :destroyを設定したいNotificationモデル。問題は、通知テーブルが巨大であることです(2,000万レコード程度)。だから私はコメントを破棄しようとすると、通知テーブルを調べるのに数分かかります。

通常、私は通知テーブルを照会するときに、created_atの範囲を指定するだけです。これはかなりうまくいくようです。

通知のすべてのコメントのcreated_atの24時間以内に作成された - だから私は関係をスピードアップするために考え出した、私はちょうど

has_many :notifications, -> { where(created_at: created_at..(created_at + 1.day)) }, dependent: :destroy 

のようなものを追加します。しかしcreated_atので動作しませんもちろん可能性があり元のコメントではなく、Notification::ActiveRecord_Relationのインスタンスで呼び出されています。

このコメントのhas_manyクエリでは、コメントの属性を参照することはありますか?

+0

あなたの質問に答えることはできませんが、通知を '破壊する '必要がありますか、それとも':削除'できますか?それはずっと速くなければなりません。あるいは、依存関係を削除し、バックグラウンドジョブを起動してそれらをクリーンアップすることもできます。 –

答えて

2

、あなたはブロックパラメータとして渡されたコメントを参照することができますAccessing the owner object詳細については、docsのセクションをご覧ください。

+0

うわー、それは素晴らしいです。 – BananaNeil

1

使用joinsどこ文の中で、子クラスを参照する:

has_many :notifications, 
      -> (comment) { where(created_at: comment.created_at..(comment.created_at + 1.day)) }, 
      dependent: :destroy 

参照してください:関連定義で

has_many :notifications, -> { joins(:notifications).where(notifications: { created_at: created_at..(created_at + 1.day) }, dependent: :destroy 
+0

ここに返答してくれてありがとう、これはうまくいくはずですが、@ BoraMaの答えは少しシンプルで、少し効率的です。なぜなら、参加する必要はなく、代わりに 'rails magic'を使うからです。 – BananaNeil

関連する問題