0

假设我的数据库中有 2 个表,都有 'updated_at' 字段。我想在一个活动记录查询中检索两个表中的所有记录。我应该返回一个由 updated_at 字段排序的大型活动记录关系。假设这两个表非常相似。

如果可能的话,最好有能力只返回前 50,或第二个 50,等等。

这是一个例子

cats = Cat.all
dog = Dog.all

animals = (cats | dogs).sort!{|a,b| a.updated_at <=> b.updated_at}.limit(50)

将所有的狗和猫合并为一个,然后再获得前 50 只动物,这是相当昂贵的。

我需要一种对 db 进行查询的方法,并且 db 返回前 50 只动物。或第二个 50 只动物。

4

2 回答 2

2

鉴于这些模型非常相似,使用 ActiveRecord 的单表继承不是更好吗?对于您提供的示例,您将拥有基类 Animal,并且您只需使用 Animal.order("updated_at").limit(50) 即可获得所需的结果

于 2012-12-11T21:29:15.090 回答
0

这不是一个单一的查询,但一个明显的优化是只抓取每个查询的前 50 个而不是整个表:

cats = Cat.order_by(:updated_at).limit(50)
dogs = Dog.order_by(:updated_at).limit(50)

animals = (cats + dogs).sort_by(&:updated_at).first(50)

然后,您可以通过查询最后一个来获得下一个 50updated_at

last_animal_date = animals.last.updated_a
next_cats = Cat.where("updated_at > ?", last_date).order_by(:updated_at).limit(50)
next_dogs = Dog.where("updated_at > ?", last_date).order_by(:updated_at).limit(50)
# etc ...

显然,对于重复的数量,这需要考虑到一种方法中,但我将其作为练习留给读者:)

于 2013-01-25T00:47:06.090 回答