如何在Rails控制器中执行原始SQL?

时间:2013-10-09 01:46:33

标签: ruby-on-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 :: connection,但连接似乎是一个实例方法而不是常量。显然,我需要正确的连接对象用于当前事务。

如何获得它? ruby文档有点令人生畏。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

找到它 - ActiveRecord :: Base.connection

......但我看到有人打败了我。 TA

答案 2 :(得分:0)

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

Client.find_by_sql("SELECT * FROM clients")

将返回与

相同的内容
Client.all

如果您不希望它映射到特定模型,您可以通过ActiveRecord :: Base.connection访问ActiveRecord数据库驱动程序的直接实例

有关可能方法的具体文档,请参阅http://apidock.com/rails/ActiveRecord/Base/connection

要做一个简单的原始SQL调用你可以使用.execute

另一种选择是直接利用Mysql2 gem,这通常在rails中没用,但是想给你选项,这假设你使用的是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