在我的应用中,用户可以创建他们的工作可能会或可能不会的图库。用户拥有并属于许多图库,每个图库都有一个由图库的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)
有谁知道如何构建一个有效的查询或后查询循环呢?
答案 0 :(得分:1)
order
不可用,但您可以使用jvnill中this answer建议的sort
- 或sort_by
如您所述,您可以使用以下代码:
(included_in + created).sort_by(&:created_at).uniq.first(5)
答案 1 :(得分: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联接表的名称是galleries_users(这是默认值)。
答案 2 :(得分:-1)
联合两个查询并从联合中选择订单。