[英]Order and sort_by difference in Ruby on Rails ActiveRecord
[英]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.urgency
将i.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.