首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在rails中使用包含时,Sort不排序

在rails中使用包含时,Sort不排序
EN

Stack Overflow用户
提问于 2014-01-31 15:05:49
回答 4查看 346关注 0票数 2

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

代码语言:javascript
运行
复制
attr_accessor :distance

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

代码语言:javascript
运行
复制
users.sort_by!(&:distance)

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

代码语言:javascript
运行
复制
users.includes(:photo).sort_by!(&:distance)

这根本不对用户进行排序,这是为什么?我怎样才能用距离来分类,但也包括关联呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-01-31 15:39:26

!方法中的sort_by!指示对象本身被更改,而不是返回不同的对象。当您调用users.includes(:photo)时,此方法返回一个不同的对象。所以,你实际上所做的是:

代码语言:javascript
运行
复制
users2 = users.includes(:photo)
users2.sort_by!(&:distance)

这就是为什么在调用sort_by!之后用户对象没有排序的原因。一个更好的方法可能是

代码语言:javascript
运行
复制
users = users.includes(:photo).sort_by(&:distance)
票数 2
EN

Stack Overflow用户

发布于 2014-01-31 15:17:17

对我来说是这样的。我做“用户”,而不是“用户”

代码语言:javascript
运行
复制
User.includes(:photo).sort_by!(&:distance)

“用户”变量到底持有什么?试一试用户。

与我的例子编辑,这里我的用户查询用户和得分的距离。

代码语言:javascript
运行
复制
    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] 

注意:你的问题错了,你否决了我。

票数 1
EN

Stack Overflow用户

发布于 2014-01-31 15:07:41

我相信你应该这么做

代码语言:javascript
运行
复制
users.sort_by!(&:distance).includes(:photo)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21483220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档