【问题标题】:How to force the order of where conditions in ActiveRecord如何强制 ActiveRecord 中 where 条件的顺序
【发布时间】:2013-08-02 07:12:20
【问题描述】:

据我所知,ActiveRecord 中的“where”方法在使用属性哈希创建 sql 命令时不授予条件顺序。例如:

Student.where(:classroom_id => 1, :serial_no => 10, :name => 'Allen')
# SELECT `students`.* FROM `students` WHERE `students`.`name` = 'Allen' AND `subscriptions`.`serial_no` = 10 AND `subscriptions`.`classroom_id` = 1

我们可以使用带有数组的“where”来强制条件格式,如下所示:

Student.where(["classroom_id = ? AND serial_no = ? AND name = ?", 1, 10, 'Allen'])
# SELECT `students`.* FROM `students` WHERE (classroom_id = 1 AND serial_no = 10 AND name = 'Allen')

但是我们会失去使用属性哈希的灵活性。实际上,我们只想按顺序强制前 2 个条件(即,classic_id 和 serial_no)。

有没有办法强制按顺序排列前两个条件并使用给定的哈希分配以下条件?

更新:

为什么我关心条件的顺序?

因为我对 (classroom_id, serial_no) 使用了多列索引。如果我们使用以下两个查询,索引就会起作用:

SELECT * FROM students WHERE classroom_id = 1 AND serial_no = 10 AND name = 'Allen'

SELECT * FROM students WHERE classroom_id = 1 AND name = 'Allen'

但不能(或没有充分利用)这两个:

SELECT * FROM students WHERE name = 'Allen' AND classroom_id = 1 AND serial_no = 10

SELECT * FROM students WHERE serial_no = 10 AND classroom_id = 1 AND name = 'Allen'

【问题讨论】:

  • 它们出现的顺序真的没有区别......结果是一样的。
  • classic_id 和 serial_no 是否使用多列索引很重要。

标签: ruby-on-rails activerecord where


【解决方案1】:

我认为你可以使用这个语法来做你想做的事:

Student.where(:classroom_id => 1).where(:serial_no => 10).where(:name => 'Allen')

#OR

Student.where(:classroom_id => 1).where(:serial_no => 10, :name => 'Allen')

希望对你有帮助

【讨论】:

  • 其实我以前试过这种方式,但我不知道这是不是最好的做法,因为如果在第一次使用 where([:classroom_id = ?, 1]) 时它不起作用条件...如果没有更好的答案,我会接受这个答案。谢谢。
  • +1 对我来说当然是一个最佳实践,查询链接是 rails 的最大特点之一(恕我直言):)
【解决方案2】:

因为当您查询数据库时,您基本上是在处理集合,我建议您阅读Boolean algebra

回答您的问题,顺序无关紧要,因为您只处理 AND 操作,所以 A and B and C 与 C and A and B 相同。

所以忘记订单,如果你没有得到你想要的结果,看看别处,因为这不是订单错误。

更新:

您是否尝试过链接 where 子句,例如:

Student.where(:classroom_id => 1, :serial_no => 10).where(:name => 'Allen')

【讨论】:

  • 刚刚在我的评论中提到过,classic_id 和 serial_no 是否使用多列索引很重要。也许我应该写更多关于为什么我需要这样做......
  • @SibevinWang 我已经用 where 链接选项更新了答案。
  • 感谢您的回复,这似乎是实现我的要求的唯一方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多