Ruby on Rails ActiveRecord中的Order和sort_by差异

Dha*_*rma 6 ruby mysql activerecord ruby-on-rails

我试图根据控制器中的时间戳字段对数据进行排序,请注意,时间戳字段可能为空,可能有一些值.我写了以下查询.

@item = Item.sort_by(&:item_timestamp).reverse
            .paginate(:page => params[:page], :per_page =>5)
Run Code Online (Sandbox Code Playgroud)

但是当我将具有time_timestamp字段值的项设置为NULL时,这会产生错误,但是后续查询有效.

@item = Item.order(:item_timestamp).reverse
            .paginate(:page => params[:page], :per_page => 5)
Run Code Online (Sandbox Code Playgroud)

任何人都可以分辨出这两个查询之间的区别,以及在哪个条件下使用哪一个?

我正在使用order和reverse来从数据库中获取最新项目,这是最好的方法还是有其他最好的方法从性能方面获取数据库中的最新数据?

Mic*_*ohl 8

sort_by在Ruby中执行,所以如果你有一个nil值,事情将以类似于这样的方式破坏:

[3, nil, 1].sort
#=> ArgumentError: comparison of Fixnum with nil failed
Run Code Online (Sandbox Code Playgroud)

order由您的RDBMS执行,通常可以使用NULL值.您甚至可以NULL VALUES通过添加NULL FIRST(通常是默认值)或NULL LAST您的ORDER BY子句来指定要放置的位置?


max*_*max 7

.sort_by是一个来自Enumerable的Ruby方法,用于对数组(或类似对象的数组)进行排序.使用.sort_by将导致所有记录从数据库加载到服务器内存中,这可能导致严重的性能问题(以及您的nil值问题).

.order是一个ActiveRecord方法,它为ORDER BYSQL select语句添加一个子句.数据库将处理对记录的排序.这在99%的情况下是优选的.