如果我这样做:
@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
答案 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打开并保持打开一分钟。突然间,一切正常!如果这还不够奇怪,那么我删除了这个虚拟记录,仍然工作。
我不接受我自己的答案,因为有人可以解释究竟发生了什么。在这一点上,恶魔占有和巫术似乎是合理的解释。