1

如果我这样做:

@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 条记录,但限制为 3 时仅返回 2 条记录。对于 3-10 的任何限制,它返回的记录比应有的少 1。我的头脑是难以置信的。

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

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

这些是我的模型:

class Shop
  has_many :opening_times
end

class OpeningTime
  belongs_to :shop
end
4

2 回答 2

1

不知道此时这是否有帮助,或者这是否是您的实际问题,但是即使表达式受到限制具有或更多记录,limit(n)返回少于记录的一种情况是您的计数器缓存设置不正确。nn

例如,

class ParentThing
  has_many :children_things
end

class ChildrenThing
  belongs_to :parent_thing
end

在这种情况下, parent_things 表有一个children_thing_count列,

ParentThing.find(1).children_things.size

将返回children_thing_count列中的任何内容(正确或不正确),而

ParentThing.find(1).children_things.limit(n).size

将始终在带有计数器的表上返回正确的计数表达式。

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

于 2013-11-12T07:12:53.267 回答
0

出色地。我有一家商店在星期六(我查询的那一天)全天关门。我开始怀疑这条记录是否充当了“幽灵”被包含在查询中(即使它不应该)而没有实际返回。这可以解释为什么每个查询的最后一条记录都丢失了,因为幽灵记录将它从列表中剔除。

所以我试着为这家商店设定一个虚拟的营业时间。我在 00:01 打开它并保持打开一分钟。突然间,一切正常!如果这还不够奇怪,那么我删除了这个虚拟记录,它仍然有效。

我不接受我自己的答案,希望有人能解释到底发生了什么。在这一点上,恶魔附身和巫术似乎是合理的解释。

于 2013-08-31T16:46:53.673 回答