【问题标题】:rails .order method not workingrails .order方法不起作用
【发布时间】:2023-03-15 06:40:01
【问题描述】:

由于某种原因,order 方法在我的代码中不起作用。如果我在模型中这样做:

def apple
    @tasks_array = self.tasks.to_a
end

使用上面的代码,返回一个数组。但如果我这样做:

def apple
    @tasks_array = self.tasks.order('order_number').to_a
end

然后

[]

返回。这是应该返回的数组,它与我编写的第一个代码块一起返回:

[#<Task id: 145, title: "task 1", content: "", created_at: "2013-12-18 18:44:31",
   updated_at: "2013-12-18 20:21:11", schedule_id: 79, amount: nil, 
   time_frame: "2013-12-19 15:00:00", state: "complete", denied: 3,
   order_number: 0>, #<Task id: 146, title: "Task 2", content: "",
   created_at: "2013-12-18 18:44:31", updated_at: "2013-12-18 20:24:06",
   schedule_id: 79, amount: nil, time_frame: "2013-12-27 10:00:00",
   state: "complete", denied: 1, order_number: 1>] 

我也试过取出 .to_a 但还是不行。

【问题讨论】:

  • 你不能按 nil 值排序,order_number 在你显示的数组中是 nil
  • 我将错误的数组发布到堆栈溢出。这些值不是零。我编辑了帖子。

标签: ruby-on-rails ruby postgresql ruby-on-rails-4


【解决方案1】:

对于这种行为,我能想到的唯一解释是:

  • self 尚未保存,或
  • 执行此语句时数据库中不存在任务记录
  • 任务记录不再与自我关联

tasks 的值仍然被缓存。 order涉及SQL查询,所以需要访问数据库。

这方面的证据是,只有在使用 order 的情况下,您才会看到一个 SQL 查询回显到控制台。

作为替代方案,您可以按如下方式使用Enumerable#sort_by

self.tasks.sort_by {|task| task.order_id}

【讨论】:

  • 哦。这就说得通了。它不会在数据库中,因为这是在验证中发生的。你知道如何订购一个不在数据库中的数组吗?
  • 您可以使用sortsort_by from Enumerable
  • 你会怎么做?我正在查看文档,但不知道如何按 order_number 排序
【解决方案2】:

您需要在 ActiveRecord 查询中指定升序或降序。

试试:

self.task.order('order_number ASC').to_a

self.task.order('order_number DESC').to_a

【讨论】:

  • 谢谢,我试过了,但是没有用。另外,我不是否决这个答案的人。
  • ASCDESC 是可选的,如果两者都不存在,则假定 ASC
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-12
  • 1970-01-01
  • 2021-12-26
  • 2017-05-23
  • 2012-09-18
相关资源
最近更新 更多