我有一个User对象,一个Package对象(User has_many packages
),然后是LocationTracker
(User 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
,它允许我很好地从一个单一位置对用户进行排序。但是,我需要能够根据可能的许多不同选项进行范围调整。例如,仅显示某个区域中的用户(可能会受到几个位置的攻击),或者所有用户对所有位置进行排序。该属性适用于单个用户 - 位置关系,但在尝试在多个位置执行搜索时失败。
答案 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
上添加索引以进行排序操作。