Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails-多数据库连接_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails RubyonRails-多数据库连接

Ruby on rails RubyonRails-多数据库连接,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在开发一个应用程序,在这个应用程序中,用户可以建立大量的数据库连接,用户和连接之间有很多关系。在用户手动连接之前,连接是被动的。目的是并行地对它们执行查询 我找不到与此相关的好教程,你能帮我提供一些关于如何完成此任务的提示吗 对于我的应用程序,我使用这个gem 有很好的文档和示例。对于我的应用程序,我使用这个gem 有很好的文档和示例。假设您想使用activerecord,可以采用两种方法: 动态类创建:请参见 定义多个类并使用所需的类,如果它们在不同的方案中,则需要指定到模型本身的连

我正在开发一个应用程序,在这个应用程序中,用户可以建立大量的数据库连接,用户和连接之间有很多关系。在用户手动连接之前,连接是被动的。目的是并行地对它们执行查询


我找不到与此相关的好教程,你能帮我提供一些关于如何完成此任务的提示吗

对于我的应用程序,我使用这个gem


有很好的文档和示例。

对于我的应用程序,我使用这个gem


有很好的文档和示例。

假设您想使用activerecord,可以采用两种方法:

  • 动态类创建:请参见
  • 定义多个类并使用所需的类,如果它们在不同的方案中,则需要指定到模型本身的连接,只有在表/模型数量不太多的情况下才可行 请参阅我的答案
这里是一个如何使用此类模型的示例,class_name参数是要使用的模型的名称。它来自Sinatra应用程序,但我相信您可以将其应用于Rails。它是一个ExtJSJavaScript应用程序的后端,使用多个模型,预期结果是JSON

 # controller

%w(create read update destroy).each do |action|
  [:get, :post].each do |method|
      send(method, "/path/#{action}") do
        response.headers['Access-Control-Allow-Origin'] = '*'
        content_type :json
        if params[:store]
          store = Object.const_get(params[:store]) 
        else
          store = Signal
        end
        resp = send(action, store, params)
        jsonp(resp)
      end
  end
end

# in helper.rb

def read (class_name, params)
  params = params.symbolize_keys
  default = {store: 'Signaal', limit: 10, sort: 'id', order: 'ASC', start: 0, user: '0'}
  params = default.merge params
  generic_data_getter(class_name, params, params[:start], params[:limit], params[:sort], params[:dir])
end

def generic_data_getter (class_name, params, start=0, limit=10, sort='id', dir='ASC')
  selection = build_selection(class_name, params)
  data = class_name.where(selection).offset(start).limit(limit).order("#{sort} #{dir}")
  {:success => true, :totalCount => data.except(:offset, :limit, :order).count, :result => data.as_json}
end
如果没有,或者对于简单的预定义搜索或速度,您可以根据需要连接和断开连接。这里是Oracle的一个示例

require 'oci8'
CONN = OCI8.new('scheme','password','dbserver')
sql = '....'
CONN.exec(sql) {|record|puts record.join(',')}
CONN.logoff

注意恶意使用,如代码注入。

假设您想使用activerecord,可以采用两种方法:

  • 动态类创建:请参见
  • 定义多个类并使用所需的类,如果它们在不同的方案中,则需要指定到模型本身的连接,只有在表/模型数量不太多的情况下才可行 请参阅我的答案
这里是一个如何使用此类模型的示例,class_name参数是要使用的模型的名称。它来自Sinatra应用程序,但我相信您可以将其应用于Rails。它是一个ExtJSJavaScript应用程序的后端,使用多个模型,预期结果是JSON

 # controller

%w(create read update destroy).each do |action|
  [:get, :post].each do |method|
      send(method, "/path/#{action}") do
        response.headers['Access-Control-Allow-Origin'] = '*'
        content_type :json
        if params[:store]
          store = Object.const_get(params[:store]) 
        else
          store = Signal
        end
        resp = send(action, store, params)
        jsonp(resp)
      end
  end
end

# in helper.rb

def read (class_name, params)
  params = params.symbolize_keys
  default = {store: 'Signaal', limit: 10, sort: 'id', order: 'ASC', start: 0, user: '0'}
  params = default.merge params
  generic_data_getter(class_name, params, params[:start], params[:limit], params[:sort], params[:dir])
end

def generic_data_getter (class_name, params, start=0, limit=10, sort='id', dir='ASC')
  selection = build_selection(class_name, params)
  data = class_name.where(selection).offset(start).limit(limit).order("#{sort} #{dir}")
  {:success => true, :totalCount => data.except(:offset, :limit, :order).count, :result => data.as_json}
end
如果没有,或者对于简单的预定义搜索或速度,您可以根据需要连接和断开连接。这里是Oracle的一个示例

require 'oci8'
CONN = OCI8.new('scheme','password','dbserver')
sql = '....'
CONN.exec(sql) {|record|puts record.join(',')}
CONN.logoff

注意恶意使用,比如代码注入。

经过研究,发现有一种更简单的方法使用ActiveRecord连接池

  • 设置用户和数据库连接之间的关系,在本例中为用户1。。n连接
  • 确保模型记录可以使用单独连接

    obj = ActiveRecord::Base.establish_connection(...spec...) 
    
    obj.connection.exec_query("Select * from users") 
    # the response is in the form of ActiveResult, which allows flexible operations around the result. 
    
  • 使用数据库完成后关闭连接

  • 参考资料:


    研究了一段时间后,发现使用ActiveRecord连接池有一种更简单的方法

  • 设置用户和数据库连接之间的关系,在本例中为用户1。。n连接
  • 确保模型记录可以使用单独连接

    obj = ActiveRecord::Base.establish_connection(...spec...) 
    
    obj.connection.exec_query("Select * from users") 
    # the response is in the form of ActiveResult, which allows flexible operations around the result. 
    
  • 使用数据库完成后关闭连接

  • 参考资料:


    您希望用户能够指定他们与一个或多个数据库建立了多少连接?另外,当你说并行性时,你是指并发性吗?你能详细解释一下你想做什么吗?我当然希望你限制一下,否则恶意的或无知的用户会把你打倒。你想让用户能够决定他们与一个或多个数据库建立了多少连接?另外,当你说并行时,你是指并发吗?你能解释一下你想做什么吗?我当然希望你限制一下,否则一个恶意的或无知的用户会把你打倒。