使用rails查询外部数据库。抽象类+ establish_connection?

时间:2015-02-19 15:16:29

标签: ruby-on-rails ruby-on-rails-4 activerecord mysql2

我正在尝试在我的rails4应用程序中建立与外部CRM数据库(MySQL)的连接。我可以通过控制台连接到数据库,我可以使用MySQL2 gem直接连接和查询使用这种方法:

connection = Mysql2::Client.new(host:11.12.14.14,username...)
results = connection.query("SELECT * FROM.....")

但是,我对如何最好地实现和重用此连接感到困惑。我担心连接池和打开太多连接......通过研究这个主题我发现了很多关于使用模型的信息......所以我设置了一个抽象模型,并将数据库连接信息放在我的database.yml中/ p>

class ExternalCrm < ActiveRecord::Base
  # No corresponding table in the DB.
  self.abstract_class = true

  establish_connection(:external_crm)

  def self.getCustomerId(first_name, last_name)
    get = connection.select_one("SELECT * FROM customers WHERE First_Name=#{connection.quote(first_name)} AND Last_Name=#{connection.quote(last_name)}")
    get.id
  end

end

这个工作......我可以运行这个方法但为什么我必须调用连接ExternalCrm.connection.select_one()而不是直接说ExternalCrm.find_by_sql()...也是,每次都会调用连接使用池还是会导致连接问题过多?

我需要运行的大多数查询只是大的原始SQL语句,所以我真的不需要activerecord和每个表的模型。所以我不确定使用抽象模型是否是最好的方法......

我的目标是建立连接,然后能够运行连接方法...例如 ExternalCrm.getUserId(firstname,lastname)

实现这一目标的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

重用连接。

你已经在课堂上结束了,因此连接将一直保持开放状态,这是一个很好的方法,多个连接的问题不用担心。


如果你正在处理多个ExternalCrm连接的表格,你还没有指定,如果不是

self.table_name = 'customers' 

可以轻松访问类ExternalCrm以使用任何方法。比如,

ExternalCrm.getUserId(firstname,lastname)

如果表格正在变化,您可以通过表格互动完成每个连接的重置, 与

  

reset_column_information

方法

查看我的blog了解更多信息。