在where子句中使用数组进行Activerecord查询

时间:2015-12-07 16:16:27

标签: ruby-on-rails activerecord

我的rails应用程序中有一个位置表,它有四列: -

| Id |经度|纬度| USER_ID

现在我有一个包含user_ids列表的数组。如何编写活动记录查询以选择每个用户ID的最后一行。例如,如果我的数组中有三个user_id [1,2,3] ,我希望查询只返回与每个user_id相对应的最后一行(假设每个user_id的条目都存在于表格中的表格。

所以,到目前为止,我可以使用以下查询获取与所有user_id相对应的所有行:

@ids = [1,2,3]
@locations = Location.where(user_id: ids)

如何修改此activerecord查询,使其仅返回与每个user_id对应的最后一行

2 个答案:

答案 0 :(得分:1)

假设您的User模型具有多个位置,您可以从用户模型开始,并使用该关联到达每个用户的最后位置。

User.where(:id => @ids).includes(:locations).collect { |u| u.locations.last }
  • User.where(:id => @ids)返回您的用户对象集合。
  • includes(:locations)急切加载关联的位置,因此我们不会遇到n+1问题。
  • collect { |u| u.locations.last }将最后关联的位置映射到数组

答案 1 :(得分:0)

你也可以试试这个:

@ids = [1,2,3]
@locations = @ids.map {|id| [Location.where(user_id: id).last.location,User.find(id).name]}
#This would give you something like this: [["US",XYZ],["IND","ABC"]]