按范围后has_many的时间戳排序

时间:2017-09-01 22:15:58

标签: ruby-on-rails postgresql sorting activerecord

我有一个User对象,一个Package对象(User has_many packages),然后是LocationTrackerUser has_many location_trackers),它充当User和Package之间的连接表,但只是跟踪详细信息例如最近的包裹递送。

我想根据他们发送的最新软件包对用户进行排序。 LocationTracker具有属性last_received_from_user

我可以通过last_received_from_user属性进行排序,轻松地从某个位置对用户进行排序,但是我还希望有一个全局索引页面,显示所有用户,按他们发送的最后一个包排序

我在分组用户时遇到问题。我正在尝试使用DISTINCT ON(last_received_from_user),但是它会抱怨该属性不在group中,当我将其添加到group时,它groups通过该时间戳,这显然是非常独特的,所以我得到重复的用户出现。

我目前的代码如下:

User.includes(:location_trackers)
  .group("location_trackers.user_id, users.id")
  .order("location_trackers.last_received_from_user #{order} NULLS LAST")

非常感谢任何帮助!

编辑:

我有last_received_from_user,它允许我很好地从一个单一位置对用户进行排序。但是,我需要能够根据可能的许多不同选项进行范围调整。例如,仅显示某个区域中的用户(可能会受到几个位置的攻击),或者所有用户对所有位置进行排序。该属性适用于单个用户 - 位置关系,但在尝试在多个位置执行搜索时失败。

1 个答案:

答案 0 :(得分:0)

  

我想根据他们发送的最新软件包对用户进行排序

使用像latest_delivery_location这样的属性并在User模型上使用回调更容易(并且更有效率),如:

class User < ApplicationRecord
  after_update :update_latest_delivery_location

  private

  def update_latest_delivery_location
    update_attributes(
      latest_delivery_location: location_trackers.last.last_received_from_user
    )
  end
end

或者在下达/分派订单后更新此类属性。我采用这种方法是因为它更易于维护,如果您希望它更具性能,您可以随时在users.latest_delivery_location上添加索引以进行排序操作。