2012-05-02 2 views
1

Если бы я имел две отдельные таблицы, установленные вверх, как это:Таблица Регистрация Ruby On Rails

University 1: 

student major year gpa 


University 2: 

student major address gpa hometown extra curriculars 

Есть ли способ, которым я мог бы получить крупные фирмы, отсортированные по верхней GPa в том, что майор? Извините, это, наверное, простой вопрос, но я довольно новичок в Ruby on Rails. Благодаря!

+1

Я хотел бы ответить на этот вопрос вопросом: почему университету 1 и университету 2 нужны отдельные таблицы? похоже, что они оба должны быть в таблице, называемой университетами. то вы можете просто вызвать University.select («DISTINCT gpa»). order («gpa DESC») – botbot

+0

Это скорее пример. Две таблицы, на которых я фактически работаю, не могут быть объединены в одну. Извините, я должен был сделать это более ясным в этом посте. – NSchulze

+0

Вы хотите, чтобы главный GPA для каждого майора в каждом университете? Например. если верхний Math GPA в # 1 равен 3,9, а верхний Math GPA в №2 равен 3,5, вы хотите, чтобы ваш результирующий набор включал только «Math, 3,9» или «Math, 3.5»? –

ответ

0

Если вы хотите иметь верхний средний балл по основным через два университета, то SQL выглядит следующим образом, например:

SELECT major, MAX(GPA) AS GPA FROM 
    (SELECT major, MAX(GPA) AS GPA FROM UNIVERSITY_1 
    GROUP BY major 
    UNION 
    SELECT major, MAX(GPA) AS GPA FROM UNIVERSITY_2 
    GROUP BY major) 
GROUP BY major 
ORDER BY GPA DESC 

Я не уверен, как выразить этот запрос в Ареле - не знаю, как это делают союзы, и это было бы хорошо знать. Тем временем вы всегда можете использовать find_by_sql для получения набора результатов из необработанного SQL.

EDIT:

Несколько Рубин-эр/Railsier способ сделать это может быть:

u_one = UniversityOne.maximum :gpa, :group => 'major' 
u_two = UniversityTwo.maximum :gpa, :group => 'major' 
u_combined = u_one.merge(u_two) { |k, one, two| [one,two].max } 

u_combined заканчивает тем, что хэш с основным в качестве ключа и максимального GPa через университеты как ценность.

+0

Что переменная бы я называю find_by_sql ("SELECT майором, MAX (GPA) AS ГПД FROM (SELECT майором, MAX (GPA) AS ГПД FROM UNIVERSITY_1 GROUP BY крупного UNION ВЫБРАТЬ майором, MAX (GPA) AS ГПД ИЗ UNIVERSITY_2 GROUP BY майор) GROUP BY major ORDER BY GPA DESC "), чтобы заставить его работать? Университета1? – NSchulze

+0

Любой класс модели должен работать, например. UniversityOne.find_by_sql (...) или UniversityTwo.find_by_sql (...). –

0

Это то, что SQL делает хорошо, поэтому вы можете сделать это в SQL. (Выполнение этого в рубиновой коде после того, как получить результаты, достаточно ясно, что вы должны быть в состоянии понять это.)

SELECT * 
FROM university 
GROUP BY major 
ORDER BY MAX(gpa) DESC 

Так, в Rails 2.x

University.find(:group => "major", :order => "MAX(gpa) DESC") 

В Rails 3.0

University.group("major").order("MAX(gpa) DESC") 
+0

Это работает, если вы хотите получить отдельные списки для каждой таблицы, за исключением того, что 'SELECT *' взорвется, потому что вы не группируете поля в предложении SELECT, и у вас никогда не было MAX (GPA) в предложении SELECT , поэтому вы не можете заказать его. Вместо этого я думал, что вы хотите: 'ВЫБРАТЬ MAJOR, MAX (GPA) из университета GROUP BY MAJOR ORDER BY MAX (ГПД)' Это сказал я думаю, что код ActiveRecord получает вас там. –

+1

Да, когда я узнал правила, вы можете заказывать только поля в списке. Но DB также заставили вас иметь все неагрегированные поля в порядке, и другие правила изменились. –

+0

Как насчет этого - спасибо! –