Rails activerecord sort_by没有排序?在某些情况下

时间:2018-02-19 09:09:30

标签: ruby-on-rails ruby sorting activerecord

我很困惑。

我有一些笔记,我需要它们按紧急程度排序。紧急度是一个虚拟属性,确定如下:

def urgency
  self.primary_tag.importance * time_since_last_seen
end

我不认为这与问题有关。

我有一个get_most_urgent def,对......错误......最紧急。

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.urgency改为i.urgency ......但是这会导致另一个测试以类似的方式失败....

知道发生了什么事吗?!关于so​​rt_by,我不了解什么?

----- EDIT --------

这与排序无关,这是一个持久性问题......你不能设置像self.last_seen = Date.today这样的属性。你需要保存它!或者使用类似:self.update(last_seen: Date.today)

的模式

3 个答案:

答案 0 :(得分:3)

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

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

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

# 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

答案 1 :(得分:0)

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

也许试试......

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

或者你可以试试这个......

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

答案 2 :(得分:0)

你确定primary_tag.importance是一个整数吗?乘法和减号都不会为字符串生成错误。

试试这个......

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