2011-06-21 15 views
2

を明確にする/ EDITEDを更新:RubyとActiveRecordを使用して排他INクエリを構築する方法は?

次のクエリは、1に等しい属性または「name_token」しているタグをすべてのブログを返すのに対し、私は私のブログのARオブジェクト

scope :with_tag_tokens, lambda {|name_tokens| 
    joins(:tags).where(:tags => {:name_token => name_tokens}) unless name_tokens.empty? 
    } 

に次のように定義されています3 OR 5(もちろん[1,3,5]に合格した場合)... "name_tokens"タグの付いたブログだけを返す類似のクエリを作成する方法があるかどうかを知りたい"1 AND 3 AND 5の。

言い換えれば...私はタグ1とタグに関連付けられている場合のみ、ブログAを返したいG 3とタグこれは、これを処理する効率的な方法であるかどうかは

+0

真:)質問を簡単にしようと、私はそれが完全に支離滅裂ました。 ..分で更新されます。 – wgpubs

+0

開発用のsqliteですが、プロダクションでherokuを使用していますので、postgres – wgpubs

+0

ここに私の答えを見て、あなたのコメントを見ました。 「グループ」と「持っている」というタグの数を利用して、どのBlogEntryがそれらのすべてに関連付けられているか把握するという解決策がありました。結果のクエリが効率的であるかどうかはわかりませんが、その簡潔さと有効性は確かです。 – wgpubs

答えて

1

-wg 4.

おかげで...それは

tags = ['rails', 'ruby'] 
BlogEntry.joins(:tags).where(:tags => {:name_token => tags}).group(BlogEntry.column_names.map {|c| BlogEntry.table_name + "." + c }.join(',')).having("count(#{BlogEntry.table_name + '.id'}) =#{tags.count}") 

に動作しますya'llはどう思いますか?より良い方法がありますか?多分、まっすぐに進んでいるSQLは、ここでの適切なアプローチです...もしそうなら、私は間違いなく他人から良いことを聞くことに興味があります。ここで

* UPDATE * 場合には人々が興味を持っているようなSQLが見えるものです:

SELECT \"blog_entries\".* 
FROM \"blog_entries\" 
    INNER JOIN \"blog_entries_tags\" ON \"blog_entries_tags\".\"blog_entry_id\" = \"blog_entries\".\"id\" 
    INNER JOIN \"tags\" ON \"tags\".\"id\" = \"blog_entries_tags\".\"tag_id\" 
WHERE \"tags\".\"name_token\" IN ('grace', 'gratitude') 
GROUP BY id 
HAVING count(blog_entries.id) =2 
ORDER BY published_at DESC, title, created_at DESC 

おかげ

+0

完了。私の答えで更新されたコードをチェックしてください。解決策を少し一般的にし、問題によってグループを解決しました(私は思う) – wgpubs

関連する問題