0

在我的应用程序中,用户可以创建他们的作品可能在也可能不在的画廊。用户拥有并属于许多画廊,每个画廊都有一个由画廊user_id字段指定的“创建者”。

因此,要获取用户所在的 5 个最新画廊,我可以执行以下操作:

included_in = @user.galleries.order('created_at DESC').uniq.first(5)
# SELECT DISTINCT "galleries".* FROM "galleries" INNER JOIN "galleries_users" ON "galleries"."id" = "galleries_users"."gallery_id" WHERE "galleries_users"."user_id" = 10 ORDER BY created_at DESC LIMIT 5

并获得他们创建的 5 个最新画廊,我可以这样做:

created = Gallery.where(user_id: id).order('created_at DESC').uniq.first(5)
# SELECT DISTINCT "galleries".* FROM "galleries" WHERE "galleries"."user_id" = 10 ORDER BY created_at DESC LIMIT 5

我想将这两个显示在一起,以便它们是他们创建的 5 个最新画廊或他们所在的画廊。类似于:

(included_in + created).order('created_at DESC').uniq.first(5)

有谁知道如何构建一个有效的查询或查询后循环来做到这一点?

4

3 回答 3

1

order不可用,但您可以使用sort- 或sort_by按照jvnill此答案中的建议

正如您所说,您可以使用以下代码:

(included_in + created).sort_by(&:created_at).uniq.first(5)
于 2013-11-11T21:55:42.253 回答
0

怎么样:

Gallery.joins("LEFT JOIN galleries_users ON galleries.id = galleries_users.gallery_id")
  .where("galleries_users.user_id = :user_id OR galleries.user_id = :user_id", user_id: id)
  .order("galleries.created_at DESC")
  .limit(5)

我假设您的 HABTM 连接表的名称是 gallery_users(这是默认值)。

于 2013-11-11T21:51:35.907 回答
-1

联合这两个查询并从联合中选择订单。

于 2013-11-11T21:27:21.020 回答