假设我的数据库中有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只动物。
答案 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
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 ...
显然,重复的数量需要将其纳入方法中,但我将其作为练习留给读者:)