2012-02-27 11 views
1

TimeLogTaskの2つのモデルがあります。 TimeLogは、Taskに属し、Taskは、多くがTimeLogです。Rails 3 - 壊れたファイルをフィルタリングする条件を検索する参照整合性の関連付け

以前は、Taskが削除されましたが、対応する削除されませんでした(カスケード削除は機能しませんでした)。だから我々はいくつかの壊れたTimeLogを持っている。彼らにはtask_idがありますが、task_idはもう存在しません。

1)私は、ユーザーからのすべてのTimeLog秒を取得したいが、壊れたものをフィルタリング:

は、私は2つの質問があります。

すなわち

TimeLog.find(:all, :conditions => ['time_log.user_id = ? and <time_log.task_id exists>]) 

2)私はそれらを手動で削除するには、コンソール内のすべての壊れたTimeLog秒を取得したいです。

すなわち

TimeLog.find(:all, :conditions => [<!time_log.task_id exists>]) 

私はそれをどのように行うことができますか?

おかげ

答えて

3

は孤立TimeLog S含めるActiveRelation呼び出しのあなたのチェーンに次のwhere()のようなものを追加します。

.where('NOT EXISTS SELECT * FROM tasks where tasks.id = timelogs.task_id') 

を...と明らかにあなたがNOTを削除する場合は、明示的に除外されます孤立したレコード。

+0

私は他の条件があります。私は両方のフィルタリング方法を適用することができますか?(find with:条件とwhere)? – Tony

+0

あなたは確かにすることができます。 Rails上のメソッド 'ActiveRelation'クラス(例えば' find'、 'where'、' order')自身が 'ActiveRelation'を返します。したがって、これらの呼び出しを連鎖させて、SQL文(例えば 'TimeLog.where(blah).where(something).order(:id)'など)を構築することができます。リレーションは実際にはSQLで評価され、 'each'コールのようなものでコンテンツを利用しようとするとDBに対して実行されます。希望が役立ちます。 – tomtheguvnor

+3

postgres用の小さな修正(実際にはどのSQLでも動作します): '' '.where(存在しない(SELECT * FROM tasks where tasks.id = timelogs.task_id) ') ' '' –

関連する問題