2014-04-18 6 views
7

I Tabelle mit dem Namen Fragen Ohne Verwendung haben wieConvert MySQL Query Active Frage an Rails find_by_sql

 
+----+---------------------------------------------------------+----------+ 
| id | title             | category | 
+----+---------------------------------------------------------+----------+ 
| 89 | Tinker or work with your hands?       |  2 | 
| 54 | Sketch, draw, paint?         |  3 | 
| 53 | Express yourself clearly?        |  4 | 
| 77 | Keep accurate records?         |  6 | 
| 32 | Efficient?            |  6 | 
| 52 | Make original crafts, dinners, school or work projects? |  3 | 
| 70 | Be elected to office or make your opinions heard?  |  5 | 
| 78 | Take photographs?          |  3 | 
| 84 | Start your own political campaign?      |  5 | 
| 9 | Free spirit or a rebel?         |  3 | 
| 38 | Lead a group?           |  5 | 
| 71 | Work in groups?           |  4 | 
| 2 | Helpful?            |  4 | 
| 4 | Mechanical?            |  6 | 
| 14 | Responsible?           |  6 | 
| 66 | Pitch a tent, an idea?         |  1 | 
| 62 | Write useful business letters?       |  5 | 
| 28 | Creative?            |  3 | 
| 68 | Perform experiments?         |  2 | 
| 10 | Like to figure things out?        |  2 | 
+----+---------------------------------------------------------+----------+ 

folgt habe ich eine SQL-Abfrage eine zufällige Datensatz aus jeder category.Can einem wandeln die mysql Abfrage Schienen zu bekommen activerecord query (ohne Verwendung von Question.find_by_sql). Diese mysql-Abfrage funktioniert absolut gut, aber ich brauche nur aktive Datensatzabfrage wegen meiner Abhängigkeit in weiteren Schritten.

Hier ist mysql query

   SELECT t.id, title as question, category 
       FROM 
       (
       SELECT 
       (
        SELECT id 
        FROM questions 
        WHERE category = t.category 
        ORDER BY RAND() 
        LIMIT 1 
       ) id 
        FROM questions t 
       GROUP BY category 
      ) q JOIN questions t 
        ON q.id = t.id 

Vielen Dank für Ihre Aufmerksamkeit!

+0

Geschätzt Ihre response.I n Kategorien haben und ich brauche eine Frage aus jeder Kategorie –

+0

leider nicht lesen die Frage richtig! – Slicedpan

Antwort

0

Die einzige Art, wie ich mich vorstellen kann, dies zu tun erfordert ein gutes Stück von Anwendungscode. Ich glaube nicht, dass es einen Weg gibt, mit ActiveRecord auf die Funktionalität RAND() in MySQL zuzugreifen (oder gleichwertig in anderen DB-Technologien). Hier ist, was ich kam mit:

counts = Question.group(:category_id).count(:id) 
offsets = {} 
counts.each do |cat_id, count| 
    offsets[cat_id] = rand(count) 
end 
random_questions = [] 
offsets.each do |cat_id, offset| 
    random_questions.push(Question.where(:category_id => cat_id).offset(offset).first) 
end 
+0

Danke für Ihre Antwort. Aber das ist nicht meine Anforderungen erfüllt. Eigentlich möchte ich, dass mysql-Abfrage aktive Datensatzabfrage ohne Verwendung von find_by_sql konvertieren. Bitte beziehen Sie sich noch einmal auf meine Frage. Schließlich brauchen wir nur aktive Datensatzabfrage. –

1

Wenn die Dinge verrückt einen haben zu erreichen, für Arel:

Es soll ein Rahmen Rahmen sein; Das heißt, Sie können Ihr eigenes ORM damit erstellen und sich dabei auf innovative Objekt- und Kollektionsmodellierung im Gegensatz zur Datenbankkompatibilität und Abfragegenerierung konzentrieren.

Also, was wir tun wollen ist, lassen Arel die Abfrage für uns erstellen. Darüber hinaus ist die Annäherung here ist gonna verwendet werden: die questions Tabelle links mit randomisierten Version von sich selbst verbunden:

q_normal = Arel::Table.new("questions") 
q_random = Arel::Table.new("questions").project(Arel.sql("*")).order("RAND()").as("q2") 

Zeit beitreten nach links

query = q_normal.join(q_random, Arel::Nodes::OuterJoin).on(q_normal[:category].eq(q_random[:category])).group(q_normal[:category]).order(q_random[:category]) 

Jetzt können Sie verwenden, welche Spalten Sie project wollen verwenden, zB:

query.project(q_normal[:id])