【问题标题】:Alternative to using 'order' within an array在数组中使用“订单”的替代方法
【发布时间】:2017-03-21 16:34:14
【问题描述】:

在处理某些记录时,我一直在对输出进行一些编辑,但我遇到了排序选项不再起作用的问题。

最初,当我执行@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 methodorder' for #`

现在我尝试通过

来解决这个问题
@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 解决方案出现错误,我将无法越过该行。

如果有人可以看一下,我将不胜感激!

【问题讨论】:

  • 如果您分享search 方法的来源(如果您编写了代码),这将很有用。
  • 您使用select 选择某些记录(从数据库中加载所有记录)而不是使用where 并仅从数据库中加载匹配记录的原因是什么?那会快得多。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    问题是您正在调用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)
    

    【讨论】:

      【解决方案3】:

      您使用的方法的签名看起来像您正在使用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)
      

      【讨论】:

      • 我真的很喜欢你对这个问题的关注,因为我有大约 9,000 条记录可以一起处理,而且有时加载确实需要一些时间disabled 是一个布尔值,但是当我查看进入你的方法,我结束了undefined method 'where' for #<Ransack::Search:0x007ff9e671fd58> 有没有办法解决这个问题?
      • 我更新了我的答案。在链中的所有洗劫方法之前需要在哪里。
      猜你喜欢
      • 1970-01-01
      • 2019-04-18
      • 2014-08-08
      • 2015-12-31
      • 2015-12-29
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多