2014-11-07 3 views
0

Я боролся с этим в течение некоторого времени. Я пытаюсь запустить запрос с помощью модели ActiveRecord.Вложенные наборы с использованием ActiveRecord

миграции:

class CreateEmployees < ActiveRecord::Migration 
    def change 
    create_table :employees, {:id => false} do |t| 
     t.string :emp 
     t.integer :lft 
     t.integer :rgt 

     t.timestamps 
    end 
    end 
end 

дб/seeds.rb

Employee.delete_all 
Employee.create(emp: 'Albert', lft: 1, rgt: 12) 
Employee.create(emp: 'Bert', lft: 2, rgt: 3) 
Employee.create(emp: 'Chuck', lft: 4, rgt: 11) 
Employee.create(emp: 'Donna', lft: 5, rgt: 6) 
Employee.create(emp: 'Eddie', lft: 7, rgt: 8) 
Employee.create(emp: 'Fred', lft: 9, rgt: 10) 

SQL, я хочу, чтобы преобразовать в AR является:

SELECT COUNT(E2.emp) AS indentation, E1.emp 
FROM Employees AS E1, Employees AS E2 
WHERE E1.lft BETWEEN E2.lft AND E2.rgt 
GROUP BY E1.emp 
ORDER BY E1.lft 

До сих пор единственным способом я был способный заставить его работать в rails, использует следующее, которое возвращает массив, и я не уверен в значении «Employee» у звезды т заявления.

Employee.connection.select_all("SELECT COUNT(P2.emp) AS indentation, P1.emp FROM Employees AS P1, Employees AS P2 WHERE P1.lft BETWEEN P2.lft AND P2.rgt GROUP BY P1.emp ORDER BY P1.lft") 

ответ

0

Вы можете выполнить SQL непосредственно:

sql = "SELECT COUNT(E2.emp) AS indentation, E1.emp FROM Employees AS E1, Employees AS E2 WHERE E1.lft BETWEEN E2.lft AND E2.rgt GROUP BY E1.emp ORDER BY E1.lft" 
result = ActiveRecord::Base.connection.execute(sql) 

, которая приведет:

[{"indentation"=>1, "emp"=>"Albert", 0=>1, 1=>"Albert"},                                                      
{"indentation"=>2, "emp"=>"Bert", 0=>2, 1=>"Bert"},                                                       
{"indentation"=>2, "emp"=>"Chuck", 0=>2, 1=>"Chuck"},                                                       
{"indentation"=>3, "emp"=>"Donna", 0=>3, 1=>"Donna"},                                                       
{"indentation"=>3, "emp"=>"Eddie", 0=>3, 1=>"Eddie"},                                                       
{"indentation"=>3, "emp"=>"Fred", 0=>3, 1=>"Fred"}] 
Смежные вопросы