当在rails中使用includes时,排序依据不排序

时间:2014-01-31 15:05:49

标签: ruby-on-rails ruby sorting

我的用户模型中有一个距离属性:

attr_accessor :distance

因此,当我计算每个用户的距离并将其存储在远处时,我可以将它们排序为:

users.sort_by!(&:distance)

用户可以根据距离进行适当的排序。但是当我包括其他相关方法时,即:

users.includes(:photo).sort_by!(&:distance)

这根本不对用户进行排序,为什么会这样?我如何用距离对其进行排序,但也包括关联?

4 个答案:

答案 0 :(得分:2)

!方法中的sort_by!表示对象本身已更改,而不是返回不同的对象。 当您致电users.includes(:photo)时,此方法会返回不同的对象。所以,你实际做的是:

users2 = users.includes(:photo)
users2.sort_by!(&:distance)

这就是在您致电sort_by!后未对用户对象进行排序的原因。更好的方法可能是

users = users.includes(:photo).sort_by(&:distance)

答案 1 :(得分:1)

它对我有用。我做"用户"而不是"用户"

User.includes(:photo).sort_by!(&:distance)

"用户"变量持有,无论如何?试试用户。

使用我的示例编辑,此处我使用用户查询和距离分数。

    1.9.3p385 :059 > Enquiry.all.sort_by!(&:score).map &:score
      Enquiry Load (0.7ms)  SELECT `enquiries`.* FROM `enquiries` 
     => [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 7, 8, 8, 10, 10] 

    1.9.3p385 :060 > Enquiry.includes(:follow_ups).sort_by!(&:score).map &:score
      Enquiry Load (0.1ms)  SELECT `enquiries`.* FROM `enquiries` 
      FollowUp Load (0.1ms)  SELECT `follow_ups`.* FROM `follow_ups` WHERE `follow_ups`.`enquiry_id` IN (55, 64, 65, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 85, 86, 89, 91, 92, 93, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127)
     => [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 7, 8, 8, 10, 10] 

1.9.3p385 :057 > enquiries = Enquiry.where(status_id: [1,2,3])

    1.9.3p385 :061 > enquiries.includes(:follow_ups).sort_by!(&:score).map &:score
      Enquiry Load (0.5ms)  SELECT `enquiries`.* FROM `enquiries` WHERE `enquiries`.`status_id` IN (1, 2, 3)
      FollowUp Load (0.2ms)  SELECT `follow_ups`.* FROM `follow_ups` WHERE `follow_ups`.`enquiry_id` IN (68, 75, 78, 91, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 113, 114, 115, 116, 117, 120, 122, 123, 124, 125, 126, 127)
     => [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 5, 5, 5, 5, 5, 5, 5, 5, 7, 8, 8, 10] 

注意:你的问题是错误的,你就是在投票给我。

答案 2 :(得分:0)

我相信你应该做

users.sort_by!(&:distance).includes(:photo)

答案 3 :(得分:0)

使用此:

User.includes(:photo).sort_by!(&:distance)

includes用于Model,不用于数组。 所以User是模型名称,用户是数组。

数组有'包括?'方法和

模型有'包含'方法

所以使用这个

 User.includes(:photo).sort_by!(&:distance)

而不是

users.includes(:photo).sort_by!(&:distance)