【问题标题】:Strange ordering of ActiveRecord objectActiveRecord 对象的奇怪排序
【发布时间】:2019-03-01 19:12:49
【问题描述】:

我正在尝试通过视图中的:id 来订购记录。我在控制器中有:id 排序的记录,就像这样

@bands = Band.where(available: true).order(:id)

应用启动时一切正常,但随着记录的更新,排序行为变得不稳定。大多数情况下,最近编辑的记录会移到最后,但并非总是如此。这不应该发生,因为记录是由 :id 排序的,不应该改变

对于上下文,在视图中类似于

<% @bands.each do |b| %>
<%= b.name %>
<% end %>

另外请注意,在 Rails 控制台中,这两个都返回正确排序的结果(这使得这个问题更加陌生):

ActiveRecord::Base.connection.execute("SELECT * FROM bands WHERE available = 'true' ORDER BY id")

Band.where(available: true).order(:id)

另外请注意,当我加载index 视图并观察rails 服务器时,我可以看到结果不是 的顺序正确。

我还可以看到已经执行的sql查询,它忽略了order部分,它根本没有在查询中提到任何顺序

【问题讨论】:

  • 首先,为了确定,停止您的 Rails 服务器(并停止/杀死任何 spring 进程),然后重新启动它。假设这不能解决问题 - 请显示更多代码,复制/粘贴完整的索引操作,加上显示正在运行的 SQL 查询的日志,您的 Band 模型是否也有任何 default_scope
  • 您确定您使用的@bands 来自@bands = Band.where(available: true).order(:id)
  • @muistooshort 你是对的。我在不同的控制器操作中编辑了一个实例变量(同名)

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


【解决方案1】:

实际上,我认为这是不可能的。 但是,试试这个:

@bands = Band.where(available: true).order(:id).to_a

【讨论】:

  • 嘿 Fred,不要把问题当作答案。最好将问题作为 cmets 发布在原始问题上。
  • 感谢您的帮助。事实证明我正在编辑正确的变量,但操作错误。
  • @smathy 公平地说,Fred 当时只有 46 个代表,而您要到 50 个才能获得 comment everywhere 特权。
  • @mu 是的,不是在责骂,只是指出一个重要的区别。我实际上认为他的编辑是一个很大的改进(尽管显然不是正确的答案)。
  • 我建议编写单元测试/规范。并测试逻辑。它总是有助于避免代码更改位置错误的类似情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 2022-01-18
  • 2011-12-23
相关资源
最近更新 更多