在Rails中加入两个不同模型查询的最佳方法?

时间:2013-04-11 02:14:52

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

我需要在页面上的选择查询和列表中将两个不同的模型连接在一起。它们共享我需要在视图中引用的所有属性(created_at,updated_at,name等),并且我希望它们按创建顺序排列。我想知道最有效的方法是什么?我正在考虑单独对每个对象执行选择查询,并将相关部分添加到公共数组中,但这似乎效率低下。

例如,如果我的模特是狗和猫,我想要一份5岁的所有狗和猫的名单,我想的是

@pets = []
dogs = Dogs.where(:age => 5)
cats = Cats.where(:age => 5)
dogs.each do |dog|
  hash = {"id" => dog.id, "name" => dog.name, "created_at" => dog.created_at }
  @pets.push(hash)
end 
cats.each do |cat|
  hash = {"id" => cat.id, "name" => cat.name, "created_at" => cat.created_at }
  @pets.push(hash)
end 

但这是最好的方法吗?另外,我不确定如何根据创建的日期对此示例中的已完成数组进行排序...

1 个答案:

答案 0 :(得分:1)

试试这个

dogs = Dogs.where(:age => 5)
cats = Cats.where(:age => 5)
@pets = (dogs + cats).sort_by { |pet| pet.created_at }

或者,如果您希望哈希值仍然存在,请使用map创建哈希数组

dogs = Dogs.where(:age => 5)
cats = Cats.where(:age => 5)
@pets = (dogs + cats).sort_by do |pet| 
  pet.created_at 
end.map do |pet| 
  { "id" => dog.id, "name" => pet.name, "created_at" => pet.created_at }
end