在使用某些记录时,我一直在对输出进行一些编辑,而且我遇到了排序选项不再有效的问题。
最初,当我执行@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
解决方案出错,我无法通过该行。
如果有人可以看看,我会非常感激!
答案 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)