如何返回与嵌套集的子项列表关联的记录?

发布于 2024-10-17 05:31:27 字数 1947 浏览 4 评论 0原文

Rails 版本 3.0.3,我是 Rails 新手,但已经使用 webdev 很长时间了。

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

我有表“posts”、“labels”和“labels_posts”

posts has_and_belongs_to_many labels
labels has_and_belongs_to_many posts

labels actions_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

此查询将返回与每个标签关联的所有帖子。

那么,rails 的方法是什么呢?


编辑:

所以,这是我的控制器

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

,这是 Rails 服务器输出,

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"

我不确定 select 方法是需要的方法。


编辑答案:

所以这是我得出的答案

@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)

Rails version 3.0.3, I am new to rails, but been in webdev for a long time.

I am using awesome nested set.

I have the tables "posts", "labels", and "labels_posts"

posts has_and_belongs_to_many labels
labels has_and_belongs_to_many posts

labels acts_as_nested_set

I have a label_id and I want to get all posts that are associated to that label and its children, all as a single ordered result set.

Let us say that I have Labels: "L1, L1.1, L1.1.1, L1.2, L2"

Given L1, and knowing that therefore I have L1, L1.1, L1.1.1, and L1.2, I would normally run the query:

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

This query would return all the posts associated with each of those labels.

So, what is the rails way to do this?


EDIT:

So, here is my controller

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

And here is the rails server output

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"

I am not sure the select method is the one that is needed.


EDIT ANSWER:

So here is the answer I arrived at

@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)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

独闯女儿国 2024-10-24 05:31:27

尝试

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

try

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)

看轻我的陪伴 2024-10-24 05:31:27

让我们首先收集标签 (label_id) 及其子标签的 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)}

Lets first collect the ids of the Label (label_id) and its children.

Then use the Ruby Array Select method to select those posts which are associated with the appropriate labels.

label_ids = Label.find(label_id).children.map(&:id).push(label_id)
posts = Post.all.select{|post| post.label_ids.include?(label_ids)}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文