2011-12-19 3 views
0

В рубином приложении рельсы, у меня есть таблица с именем test_details со следующими полями:Рубин на Rails: сложный расчет запрос

id, 
profileId, 
testName, 
testId, 
dateCovered, 
levelCompleted, 
userResult, 
unit 

здесь levelCompleted может иметь одно из пяти значений:

l1, l2, l3, l4, l5 

Я хочу создать отчет для подсчета количества уровней на основе testName, а его процент

так:

testID ll  l2   l3  l4  l5 
------------------------------------------------------- 
test1 25(25%) 45(35.2%) 12(10%) 12(10%) 15(12%) 
test2 25(25%) 45(35.2%) 12(10%) 12(10%) 15(12%) 
test3 58(25%) 445(35.2%) 145(10%) 42(10%) 25(12%) 

(значения и процент не точные значения)

, как я могу сделать это в контроллере и посмотреть?

Мой код контроллера:

@all_tests = TestDetails.count 
    @test_details = TestDetails.select("DISTINCT(testName)") 
    puts(@test_details) 
    @test_details.each do | test_details | 
    @test_name = test_details["testName"]; 
    @level1_total = TestDetails.where("testName =? and levelCompleted =? and dateCovered is ?",test_details["testName"],1,nil).count 
    @level1_total_percent = (@level1_total/@all_tests.to_f)*100 

    @level2_total = TestDetails.where("testName =? and levelCompleted =? and dateCovered is ?",test_details["testName"],2,nil).count 
    @level2_total_percent = (@level2_total/@all_tests.to_f)*100 

    @level3_total = TestDetails.where("testName =? and levelCompleted =? and dateCovered is ?",test_details["testName"],3,nil).count 
    @level3_total_percent = (@level3_total/@all_tests.to_f)*100 

    @level4_total = TestDetails.where("testName =? and levelCompleted =? and dateCovered is ?",test_details["testName"],4,nil).count 
    @level4_total_percent = (@level4_total/@all_tests.to_f)*100 

    @level5_total = TestDetails.where("testName =? and levelCompleted =? and dateCovered is ?",test_details["testName"],5,nil).count 
    @level5_total_percent = (@level5_total/@all_tests.to_f)*100 

конец

+0

@m_x Я хочу иметь представление, подобное приведенной выше структуре таблицы. – SHANib

+0

Хорошо, я попробую после работы. cu –

+0

@m_x ok .. спасибо ... Я также пытаюсь выполнить некоторые ауты .. – SHANib

ответ

1

Прежде всего, то, как вы запрашиваете у БД, совершенно неэффективно. Вы делаете огромное количество (2 + 5 * количество различных testNames) запросов, чтобы получить эту работу, каждый из них сканирует всю таблицу! На большом столе ваша БД наверняка задушит это.

Я настоятельно рекомендую вам узнать больше о SQL, о том, как работает база данных, и как правильно разработать ее.The Wikipedia entry for db design is a good start, тогда вы можете отправиться на something more consistent.

В сыром SQL, что вы пытаетесь достичь, это возможно в одном тривиальном запросе:

SELECT  testName, levelCompleted, COUNT(*) AS count 
    FROM  test_details 
    GROUP BY testName, levelCompleted 

# BTW, your field names don't follow rails convention... 
# try to follow the conventions unless you have 
# very good reasons not to do so. 

это было бы получить все данные, необходимые для выполнения расчетов, как это:

testName | levelCompleted | count 
----------------------------------- 
testone |  1   | 10 
testone |  2   | 10 
testone |  3   | 15 
testone |  4   | 3 
testone |  5   | 2 
testTWO |  1   | 10 
testTWO |  2   | 15 
testTWO |  3   | 4 

# and so on... there's two gotcha though: 
# - if there is no record for a particular 
# level and testName, itwon't appear at all in this ! 
# - the order of the rows is not guaranteed, 
# but you can enforce it with an ORDER clause 

Таким образом, расчеты Rails могут оказаться немного сложными. Мне не хватает времени, чтобы развить это здесь, и я думаю, что это не помогло бы вам ни дать вам ответ из коробки ... Вы действительно должны вникать в руководства RoR, особенно о migrations, associations , и queries.

Я остаюсь в наличии, если у вас есть какие-либо вопросы.

+0

другое: избегайте называть ваши модели такими универсальными именами, как 'Test'. Это лучший способ создать конфликты с другими модулями или даже с родными частями Rails. –

+0

thanx @m_x, я новичок в рубине, всего за две недели я начал работать над ror. спасибо за ур ценные sugestions. я хотел бы знать, как можно получить процентные данные из этого запроса .. – SHANib

+0

успешно реализован благодаря ребятам .. @ m_x, @ syed Aslam – SHANib

0

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

Почему бы вам не попробовать работать с хэшами вместо этого, а не с несколькими массивами? This и this - некоторые из ссылок.

Структура хэш может выглядеть следующим образом:

report = { 
    test1 => { 
    level1 => { 
     total => "total", 
     percent => "percent" 
    }, 

    level2 => { 
     total => "total", 
     percent => "percent" 
    }, 

    ...  
    }, 

    test2 => { 
    level1 => { 
     total => "total", 
     percent => "percent" 
    } 

    ... 
    } 
} 

Почему бы вам не попробовать этот подход и получить обратно с некоторым кодом, если вы застряли? Мы постараемся помочь вам реорганизовать и оптимизировать.

+0

На самом деле, моя цель - создать pdf из этих данных. В настоящее время я использую креветку для достижения этого. Мне хотелось бы знать, могут ли эти хэш-данные использоваться на странице .prawn для генерации pdf? – SHANib

+1

Да. Его можно использовать. –

+0

Я не мог генерировать хэш динамически? любые примеры? – SHANib

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