2013-04-11 3 views
0

У меня есть две разные модели, которые мне нужно объединить в запросе выбора и списке на странице. Они делятся всеми атрибутами, которые мне нужны для ссылки в представлении (created_at, updated_at, name и т. Д.), И я хочу их в порядке создания. Мне интересно, что самый эффективный способ сделать это? Я думал о выполнении запроса выбора по каждому объекту индивидуально и добавлению соответствующих частей в общий массив, но это кажется неэффективным.Лучший способ присоединиться к двум различным запросам модели в Rails?

Например, если мои модели были собаки и кошки, и я хотел список всех собак и кошек в возрасте 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

попробовать этот

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

ИЛИ если вы хотите, чтобы ваши хэши еще, использование карты для создания массива хешей

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 
+0

первое решение отличное, спасибо! – user1436111

Смежные вопросы