替代在数组中使用“order”

时间:2017-03-21 16:34:14

标签: ruby-on-rails arrays ruby rails-activerecord

在使用某些记录时,我一直在对输出进行一些编辑,而且我遇到了排序选项不再有效的问题。

最初,当我执行@record.class时,事情是如何创建的,输出是Record::ActiveRecord_Relation < ActiveRecord::Relation

但是现在我做了更改后,课程发生了变化。所以现在当我运行@record.class时,输出为Array < Object

我认为这是我遇到这个问题的根本原因。

我的代码是

@q = @records.search(params[:q])
@records = @q.result(distinct: true).select { |k,_v| k[:disabled] }
@records = @records.order("records.updated_at desc").page(params[:page] || 1).per(params[:per] || 30)

我得到的错误是NoMethodError: undefined method为#`

的顺序

现在我试图通过

来锻炼身体
@records = @records.sort_by("records.updated_at desc")
@records = @records.paginate.page(params[:page] || 1).per(params[:per] || 30)

然而,我的解决方案第一行的错误是@records = @records.sort_by("records.updated_at desc")如果我的paginate解决方案出错,我无法通过该行。

如果有人可以看看,我会非常感激!

3 个答案:

答案 0 :(得分:1)

你的@records是一个Ruby数组,而不是一个ActiveRecord“数组”
您可以尝试@records.sort_by(&:updated_at)对数组进行排序

答案 1 :(得分:1)

问题是您正在调用result,这导致执行SQL查询并从数据库返回数据。如果要使用ActiveRecord使用的Arel AST继续形成查询,则不希望这样做。你想要更接近这一点(你可能需要适应):

r = records.where(some_param: some_value, disabled: true) \
           .order(updated_at: :desc) \
           .page(params[:page] || 1).per(params[:per] || 30)

答案 2 :(得分:1)

您使用的方法使用ransack

不是将所有记录加载到内存中并在Ruby中选择匹配记录,而是首先只加载来自数据库的匹配记录可能要快得多。

假设disabled是数据库中的布尔列,我建议更改

@q = @records.search(params[:q])
@records = @q.result(distinct: true).select { |k,_v| k[:disabled] }
@records = @records.order("records.updated_at desc").page(params[:page] || 1).per(params[:per] || 30)

@q = @records.where(disabled: true).search(params[:q])
@records = @q.result(distinct: true)
@records = @records.order("records.updated_at desc").page(params[:page] || 1).per(params[:per] || 30)