使用ActiveRecord的嵌套集

时间:2014-11-07 23:23:20

标签: ruby-on-rails activerecord nested-sets

我一直在努力解决这个问题。我正在寻求使用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")

1 个答案:

答案 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"}]