从2个表中获取记录并按日期合并它们

时间:2012-12-11 21:07:48

标签: ruby-on-rails ruby-on-rails-3 activerecord

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

如果可能的话,最好能够只返回前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只动物。

2 个答案:

答案 0 :(得分:2)

鉴于这些模型非常相似,使用ActiveRecord的Single table inheritance会不会更好?对于您提供的示例,您将拥有基类Animal,只需使用Animal.order(“updated_at”)即可获得所需的结果.limit(50)

答案 1 :(得分: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)

然后您可以通过查询最后updated_at

来获得下一个50
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 ...

显然,重复的数量需要将其纳入方法中,但我将其作为练习留给读者:)