2013-06-28 220 views
-1

我正在做一個簡單的博客應用程序 - 有帖子,其中有很多標籤通過posts_tags表(我的模型如下)。我已經實現的是,如果用戶點擊標籤,它將只顯示帶有該標籤的帖子。我想要的是讓用戶能夠選擇另一個標籤,並且它只會過濾到包含這兩個標籤的帖子,然後是第三個,然後是第四個等。我很難製作活動記錄查詢 - 尤其是動態的。我得到的最接近的是下面列出的 - 不過它在純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 

回答

1

試用一下:你想使用時,鋼軌寫原始SQL遠離

Post.joins(:tags).where(tags: {id: [1, 3]}).select("posts.id, count(*)").group("posts.id").having("count(*) > 2") 
+0

這是神奇的。我將花費相當長的一段時間去解決這個問題!非常感謝 – cadlac

0

我認爲「數= 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 
0

一般。 Active Record有很好的輔助方法,可以讓你的sql更具可讀性和可維護性。

如果只有幾個標籤,你可以爲他們每個人創建範圍(http://guides.rubyonrails.org/active_record_querying.html#scopes

由於人們對標籤一次一個你可以只查詢每一個標籤,然後在使用&操作點擊陣列。因爲您已經從數據庫請求了完全相同的一組數據,所以查詢結果應該被緩存,這意味着您只需要敲擊最新查詢的數據庫。