我的用户模型中有一个距离属性:
attr_accessor :distance
因此,当我计算每个用户的距离并将其存储在远处时,我可以将它们排序为:
users.sort_by!(&:distance)
用户可以根据距离进行适当的排序。但是当我包括其他相关方法时,即:
users.includes(:photo).sort_by!(&:distance)
这根本不对用户进行排序,为什么会这样?我如何用距离对其进行排序,但也包括关联?
答案 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)