Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 按RubyonRails上创建的或更新的排序(以较新的为准)_Ruby On Rails_Ruby_Rails Activerecord - Fatal编程技术网

Ruby on rails 按RubyonRails上创建的或更新的排序(以较新的为准)

Ruby on rails 按RubyonRails上创建的或更新的排序(以较新的为准),ruby-on-rails,ruby,rails-activerecord,Ruby On Rails,Ruby,Rails Activerecord,我有一个感觉很简单的问题,只是我似乎找不到答案 我有一组记录: @mymonkeys=@user.monkeys.all 我需要的是最近与之互动(创建或更新)的3只猴子 我可以得到最近制作的猴子,如下所示: @mymonkeys.sort_by(&:created_at).reverse!。取(3) 最近更新的猴子是这样的: @mymonkeys.sort_by(&:updated_at).reverse!。取(3) 但是是否有一行代码返回最近创建或更新的猴子? 非常感谢 附言: 我看到 其

我有一个感觉很简单的问题,只是我似乎找不到答案

我有一组记录:

@mymonkeys=@user.monkeys.all

我需要的是最近与之互动(创建或更新)的3只猴子

我可以得到最近制作的猴子,如下所示:
@mymonkeys.sort_by(&:created_at).reverse!。取(3)

最近更新的猴子是这样的:
@mymonkeys.sort_by(&:updated_at).reverse!。取(3)

但是是否有一行代码返回最近创建或更新的猴子?

非常感谢



附言: 我看到
其中提到了
coalesce
关键字,但我无法确定这是否是我想要的。

&:created_at
{monkey | money.created_at}
的语法糖。通过你想做什么就做什么的街区

@mymonkeys.sort_by { |m| [m.created_at, m.updated_at].max }.reverse!.take(3)
您可以(也可能应该)在数据库中执行此操作,但COALESCE不是您想要的。COALESCE用于将null转换为SQL中的其他内容,例如:

coalesce(might_be_null, what_i_want_instead_of_null)
在您的情况下,应该始终在处创建
和在
处更新
这两个位置,这样您就不必担心空值

如果要选择几个值中的最大值,则要使用;如果你想要最小的,那么使用最少的;任何值得用于实际工作的数据库都应该支持最大值和最小值,但如果需要,您可以用一个案例来伪造它。最新的时间戳是最大的,因此您希望按
最大(创建时,更新时)排序
;您还需要将最近的三个列在列表的顶部,因此您需要降序排序(即,最大的排在第一位);您可以在数据库中发送限制3。这给了你:

three_recent_monkeys = @user.monkeys.order('greatest(created_at, updated_at) desc').limit(3)
这是Rails,因此
updated\u at
应始终至少
created\u at
so
grest(created\u at,updated\u at)
应始终
updated\u at
。这意味着你可以简化事情,只需说:

three_recent_monkeys = @user.monkeys.order('updated_at desc').limit(3)

是否有过这样的情况,即在
处创建的
大于在
处更新的?换句话说,我相信当记录第一次保存时,
updated\u at==created\u at
。@GSP:
created\u at您可以通过将整数传递给
last()
方法:
}.last(3)
而不必使用
reverse()。我不确定,但我也假设可以使用sql/ActiveRecord使用
.order()
,即不必将所有内容都转换为数组(我相信这是通过
sort\u by
实现的)。