我一直在努力解决这个问题。我正在寻求使用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)
我要转换为AR的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
到目前为止,我能够让它在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 :(得分: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"}]