繁体   English   中英

Rails activerecord sort_by不排序吗? 在某些情况下

[英]Rails activerecord sort_by not sorting? In some situations

我很混乱。

我有一些注释,我需要按紧急程度对它们进行排序。 紧急度是一个虚拟属性,其确定方式如下:

def urgency
  self.primary_tag.importance * time_since_last_seen
end

我认为这与问题无关。

我有一个get_most_urgent def,以便.. errr ...最紧急。

def self.get_most_urgent
  Note.all.sort_by{|i| - i.urgency}.first
end

这有时...有效。 我在一项测试中遇到了这种疯狂的情况(对不起,我将测试笔记称为@bob和@trey。我应该真正更改它们)

[1] pry(#<RSpec::ExampleGroups::Note>)> @trey.urgency
 => 12
[2] pry(#<RSpec::ExampleGroups::Note>)> @bob.urgency
=> 9
 [3] pry(#<RSpec::ExampleGroups::Note>)> Note.get_most_urgent
 => #<Note:0x007fdf801924d8 id: 732, body: "bob", todo_by: nil, 
 last_seen: Mon, 19 Feb 2018, created_at: Mon, 19 Feb 2018 09:00:06 
  UTC +00:00, updated_at: Mon, 19 Feb 2018 09:00:06 UTC +00:00, 
 seentoday: false>

如您所见,它使bob最紧急。 我以为我只是不应该理解排序的工作原理, - i.urgencyi.urgency更改为i.urgency ...但这会导致另一项测试以类似的方式失败。

知道发生了什么吗?! 我对sort_by不了解?

- - -编辑 - - - -

这与排序无关,这是一个持久性问题……您不能设置诸如self.last_seen = Date.today这样的属性。 您需要保存! 或使用以下模式: self.update(last_seen: Date.today)

首先将所有笔记加载到内存中,然后对它们进行排序,然后返回第一条记录就无法很好地扩展数据库中更多的笔记。

相反,我建议对数据库中的记录进行排序,并仅加载您实际需要的一条记录。

我会在Note模型中添加一个by_urgency范围,该范围允许对数据库中的记录进行排序:

# in models/note.rb
scope :by_urgency, lambda {
  joins(:primary_tag).
    order("tags.importance * DATEDIFF(day, notes.created_at, NOW()) DESC")
}

使用此作用域,您可以像这样重写get_most_urgent方法:

def self.get_most_urgent
  Note.by_urgency.first
end

我没有看到为什么它不起作用,但这可能是解析一元运算符的方式?

也许尝试...

Notel.all.sort_by{|note| (0 - note.urgency) }.first

或者您也可以尝试一下...

Note.all.sort {|a,b| b.urgency <=> a.urgency}.first

您确定primary_tag.importance是整数吗? 乘和减都不会为字符串产生错误。

尝试这个...

def urgency
  self.primary_tag.importance.to_i * time_since_last_seen.to_i
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM