2011-02-12 105 views
0

Rails版本3.0.3,我是rails新手,但在webdev很長一段時間。如何返回與嵌套集的子列表關聯的記錄?

我正在使用超棒的嵌套集。

我有表 「上崗」, 「標籤」 和 「labels_posts」

帖子has_and_belongs_to_many標籤
標籤has_and_belongs_to_many帖子

標籤acts_as_nested_set

我有一個label_id,我想獲取與該標籤及其子項關聯的所有帖子,全部作爲單個排序結果集。

讓我們說,我有標籤: 「L1,L1.1,L1.1.1,L1.2,L2」

鑑於L1,並且知道所以我有L1,L1.1,L1。 1.1和L1.2,我通常會運行查詢:

select id, title 
from posts 
where exists (select * from labels_posts where labels_posts.post_id = posts.id and labels_posts.label_id IN ('L1', 'L1.1', 'L1.1.1', 'L1.2')) 
order by created_at desc 

此查詢將返回與每個這些標籤關聯的所有帖子。

那麼,軌道的做法是什麼?


編輯:

所以,這裏是我的控制器

@label = Label.find(params[:label]) 
@posts = Post.all.select do |post| 
    post.label_ids.include?(@label.self_and_descendants.map(&:id)) 
end 

這裏是軌道服務器輸出

Label Load (0.5ms) SELECT "labels".* FROM "labels" WHERE ("labels"."cached_slug" = 'caribbean') LIMIT 1 
Post Load (0.6ms) SELECT "posts".* FROM "posts" 
Label Load (0.2ms) SELECT "labels".id FROM "labels" INNER JOIN "labels_posts" ON "labels".id = "labels_posts".label_id WHERE ("labels_posts".post_id = 1) 
Label Load (0.8ms) SELECT "labels".* FROM "labels" WHERE ("labels"."lft" >= 1 AND "labels"."rgt" <= 8) ORDER BY "lft" 
Label Load (0.1ms) SELECT "labels".id FROM "labels" INNER JOIN "labels_posts" ON "labels".id = "labels_posts".label_id WHERE ("labels_posts".post_id = 2) 
CACHE (0.0ms) SELECT "labels".* FROM "labels" WHERE ("labels"."lft" >= 1 AND "labels"."rgt" <= 8) ORDER BY "lft" 

我不知道該選擇方法那是需要的。


編輯答案:

因此,這裏是我來到

@label = Label.find(params[:label]) 
@posts = Post.order('posts.created_at desc').where('labels_posts.label_id IN (?)', @label.self_and_descendants.map(&:id)).includes(:labels) 

回答

2

答案嘗試

Post.all(:conditions => "id = labels_posts.post_id AND label_posts.label_id in('L1', 'L1.1', 'L1.1.1', 'L1.2')", :include => [:label => labels_posts], :order => :created_at)

+0

這是什麼樣的,我需要,它似乎並不很「軌」十歲上下,但一個問題是如何拍攝的「Label.find(PARAMS [:標籤])的結果。self_and_descendants 「並將其轉換爲IN比較中的參數列表? – 2011-02-12 20:49:33

+0

這似乎是最接近的答案。我用我到達的答案編輯了這個問題。 – 2011-02-13 23:48:02

0

讓我們先收集標籤的ID( label_id)及其子項。

然後使用Ruby Array Select方法選擇與相應標籤關聯的帖子。

label_ids = Label.find(label_id).children.map(&:id).push(label_id) 
posts = Post.all.select{|post| post.label_ids.include?(label_ids)} 
相關問題