【问题标题】:Sorting 2 arrays that have been added together对已相加的 2 个数组进行排序
【发布时间】:2013-11-12 05:55:42
【问题描述】:

在我的应用程序中,用户可以创建他们的作品可能在也可能不在的画廊。用户拥有并属于许多画廊,每个画廊都有一个由画廊的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)

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

【问题讨论】:

  • (included_in + created).order('created_at DESC').uniq.first(5) 不起作用吗?还是尝试减少查询次数?
  • @dax 不行,给undefined method 'order' for #<Array:0x007fda568e8248>
  • @dax 效果很好,谢谢!如果您想写出解决方案,我也很高兴为您提供答案:(included_in + created).sort_by(&:created_at).uniq.first(5)
  • 酷,很高兴它有帮助!

标签: ruby-on-rails ruby-on-rails-3 activerecord


【解决方案1】:

order 不可用,但您可以使用sort - 或sort_by,如jvnill 在this answer 中所建议的那样

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

(included_in + created).sort_by(&:created_at).uniq.first(5)

【讨论】:

    【解决方案2】:

    怎么样:

    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(这是默认值)。

    【讨论】:

    • 感谢@sampierson,这可能有效,但我希望保持简单/可读/Rails-y,而不是尽可能使用专用的 SQL 查询
    【解决方案3】:

    联合两个查询并从联合中选择顺序。

    【讨论】:

    • 这是一个相当笼统的陈述......需要详细说明吗?
    猜你喜欢
    • 1970-01-01
    • 2019-06-24
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    相关资源
    最近更新 更多