我很困惑。
我有一些笔记,我需要它们按紧急程度排序。紧急度是一个虚拟属性,确定如下:
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
......但是这会导致另一个测试以类似的方式失败....
知道发生了什么事吗?!关于sort_by,我不了解什么?
----- EDIT --------
这与排序无关,这是一个持久性问题......你不能设置像self.last_seen = Date.today
这样的属性。你需要保存它!或者使用类似:self.update(last_seen: Date.today)
答案 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