TimeLog
とTask
の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>])
私はそれをどのように行うことができますか?
おかげ
私は他の条件があります。私は両方のフィルタリング方法を適用することができますか?(find with:条件とwhere)? – Tony
あなたは確かにすることができます。 Rails上のメソッド 'ActiveRelation'クラス(例えば' find'、 'where'、' order')自身が 'ActiveRelation'を返します。したがって、これらの呼び出しを連鎖させて、SQL文(例えば 'TimeLog.where(blah).where(something).order(:id)'など)を構築することができます。リレーションは実際にはSQLで評価され、 'each'コールのようなものでコンテンツを利用しようとするとDBに対して実行されます。希望が役立ちます。 – tomtheguvnor
postgres用の小さな修正(実際にはどのSQLでも動作します): '' '.where(存在しない(SELECT * FROM tasks where tasks.id = timelogs.task_id) ') ' '' –