db查询中的限制为某些值返回错误的数量

时间:2013-08-31 13:37:34

标签: ruby-on-rails database activerecord limit ruby-on-rails-4

如果我这样做:

@open_shops = Shop.includes(:opening_times).where("opening_times.day =?", today)
              .order("opening_times.opens+opening_times.open_for")

@ open_shops.size返回10

如果我这样做:

@open_shops = Shop.includes(:opening_times).where("opening_times.day =?", today)
              .order("opening_times.opens+opening_times.open_for")
              .limit(2)

@ open_shops.size按预期返回2。 .limit(1)也按预期工作。

但如果我这样做:

@open_shops = Shop.includes(:opening_times).where("opening_times.day =?", today)
              .order("opening_times.opens+opening_times.open_for")
              .limit(3)

@ open_shops.size返回2!正如您在上面所看到的,当没有限制时返回10条记录,但只返回2条记录,限制为3.对于3-10的任何限制,它返回的值少于它应该的值。我的思绪难以置信。

删除where语句或order语句使限制按预期工作。

编辑:也许值得注意的是,每次都缺少相同的记录。它始终是列表中最后一个缺失的。因此,limit(3)确切地返回限制(2)应该返回的结果。

这些是我的模特:

class Shop
  has_many :opening_times
end

class OpeningTime
  belongs_to :shop
end

2 个答案:

答案 0 :(得分:1)

此时不知道这是否有帮助,或者这是否是您的实际问题,而是limit(n)返回少于n个记录的一种情况,即使表达式受限{当您错误地设置计数器缓存时,{1}}或更多记录。

例如,

n

在这种情况下,parent_things表具有class ParentThing has_many :children_things end class ChildrenThing belongs_to :parent_thing end 列,

children_thing_count

将返回ParentThing.find(1).children_things.size 列中的任何内容(正确或不正确),而

children_thing_count

将始终使用计数器在表格上返回正确的计数表达式。

所以,要非常小心计数器缓存的 !!

答案 1 :(得分:0)

好。我有一家商店周六全天关闭(我查询的那天)。我开始想知道这条记录是否充当了一个“幽灵”,它被包含在查询中(即使它不应该)而没有实际返回。这可以解释为什么每个查询的最后一条记录都丢失了,因为鬼记录将其从列表中删除。

所以我尝试为这家商店制作假的开放时间。我把它在00:01打开并保持打开一分钟。突然间,一切正常!如果这还不够奇怪,那么我删除了这个虚拟记录,仍然工作。

我不接受我自己的答案,因为有人可以解释究竟发生了什么。在这一点上,恶魔占有和巫术似乎是合理的解释。