-1

私は単純なブログアプリケーションをやっています - posts_tags テーブルを介して多くのタグを持つ投稿があります (私のモデルは以下にあります)。私が実装したのは、ユーザーがタグをクリックすると、そのタグが付いた投稿だけが表示されるということです。私が望むのは、ユーザーが別のタグを選択できるようにすることであり、それらのタグの両方、次に 3 番目、4 番目などを持つ投稿のみにフィルター処理されます。アクティブなレコードを作成するのが困難ですクエリ - 特に動的。私が得た最も近いものを以下に示しますが、それは純粋な SQL であり、複雑であっても、少なくとも ActiveRecord Rubyland 構文で使用したいと考えています。

また、「カウント2を持つ」は機能せず、「カウント」が存在しないと言って、名前を付けても。しかし、それは私のテーブルに出力されています(カウントの背後にある考え方は、検索しているタグの数と同じ数が含まれている場合、理論的/理想的にはすべてのタグを持っているということです)

現在のテスト SQL クエリ

select posts_tags.post_id,count(*) from posts_tags where tag_id=1 or tag_id=3 group by post_id ### having count=2

テスト SQL からの出力 (多くは含まれていませんが、いくつかの単純なシード データのみが含まれていることはわかっています)。

 post_id | count 
---------+-------
       1 |     2
       2 |     1

私のモデル: /post.rb

class Post < ActiveRecord::Base
    has_many :posts_tags
    has_many :tags, :through => :posts_tags
end

/tag.rb

class Tag < ActiveRecord::Base
    has_many :posts_tags
    has_many :posts, :through => :posts_tags
end

/poststag.rb

class PostsTag < ActiveRecord::Base
    belongs_to :tag
    belongs_to :post
end
4

3 に答える 3

1

試してみてください:

Post.joins(:tags).where(tags: {id: [1, 3]}).select("posts.id, count(*)").group("posts.id").having("count(*) > 2")
于 2013-06-28T03:35:01.513 に答える
0

一般に、Rails を使用するときは生の SQL を書くことは避けたいものです。Active Record には、SQL をより読みやすく保守しやすくする優れたヘルパー メソッドがあります。

タグが数個しかない場合は、それぞれにスコープを作成できます ( http://guides.rubyonrails.org/active_record_querying.html#scopes )

人々は一度に 1 つずつタグをクリックしているので、各タグに対してクエリを実行&し、配列に対して演算子を使用することができます。データベースからまったく同じデータセットを既に要求しているため、クエリ結果はキャッシュされる必要があります。つまり、最新のクエリのデータベースにアクセスするだけです。

于 2013-06-28T03:51:44.937 に答える
0

「count = 2」は正しくないと思います。「count(*) = 2」である必要があります。クエリは次のようになります

select post_id,count(post_id) 
from posts_tags 
where tag_id = 1 or tag_id = 3 
group by post_id 
having count(post_id) = 2
于 2013-06-28T03:17:35.487 に答える