2013-10-09 33 views
0

是的,我知道这不是推荐的,但我想在控制器中执行原始SQL,只是看看它是如何完成的。如何在Rails控制器中执行原始SQL?

class FooController < ApplicationController 
    def foo 
    boz = 'd' 
    connection.select_rows('select * from dual').each do |r| 
     boz = r[0] 
    end 

    [boz: boz] 
    end 
end 

然后我的看法将有希望渲染'boz is“X”!'。

当然,这个失败是因为连接没有定义。我试过ActiveRecord ::连接,但连接似乎是一个实例方法,而不是一个常量。显然,我需要当前事务的正确连接对象。

如何得到它? Ruby的文档有点令人生畏。

回答

1
ActiveRecord::Base.connection.execute('select * from dual') 
0

找到它 - 的ActiveRecord :: Base.connection

...但我看到有人打我给它。助教。

0

如果您正在寻找特定型号,也可以这样做。

Client.find_by_sql("SELECT * FROM clients") 

将返回相同

Client.all 

如果你不希望它映射到一个特定的模式,您可以通过访问ActiveRecord的数据库驱动程序直接实例的ActiveRecord :: Base的。连接

请参阅http://apidock.com/rails/ActiveRecord/Base/connection了解可能的方法的特定文档。

做一个简单的原始的SQL调用U可以,请使用.execute

另一种方法是直接利用的Mysql2宝石,这通常是铁轨内没有什么用处,但想给你的选择,这是假定你正在使用mysql,但其他适配器也可以直接使用。

client = Mysql2::Client.new(YAML.load(File.read(Rails.root.join(*%w[config database.yml])))[Rails.env]) 
results = client.query("SELECT * FROM clients") 
results.each(:symbolize_keys => true) do |row| 
    # Do something with a row 
end