2011-12-27 8 views
0

初心者の方はご質問申し訳ありません。 私は資産とプロジェクトの間にhabtm関係を持っています。仮定すると、私は、この資産に関連付けられていないすべてのプロジェクトを見つけたいすべての資産を通してループするんだけど、これは動作しません:存在しないhabtmレコードの問い合わせ

Project.includes(:assets).where("assets.id != ?", asset.id) 

適切なクエリは何ですか?

答えて

0

あなたが特定の資産に関連付けられていないすべてのプロジェクトを検索したい場合は、このようなものが動作するはずです(それが必要なように調整し、未テストです):

Project.joins(:assets_projects).where("assets_projects.asset_id != ?", asset_id) 

asset_idがあなたの資産インスタンスのidです。

また、反復の現在のアセットに関連付けられているすべてのプロジェクトを見つけるためにアセットをループすることは避けてください。これはデータベースコールが多すぎることを意味します(N + 1という問題です。例えば、here) 。 1つのクエリだけで資産に関連付けられていないすべてのプロジェクトを検索するには、次のようにします:

+0

ありがとうございますが、何も見つかりません。私はProject.find_by_sql([* SELECT * FROM projectsどこから存在しないのですか?(SELECT * FROM assets_projects where assets_projects.asset_id!=?) "、asset.id])。どんな手掛かり? – zbigniew

+0

質問の新しいバージョンに基づいて自分の回答を編集しました。それが助けてくれることを躊躇しないでください。 – maprihoda

関連する問題