2014-10-26 57 views
1

在rails应用程序中,我在外部数据库上做了一些请求。在NewRelic的,当我在看SQL请求我有这样的:跳过ActiveRecord提出的额外请求

2.997 718 ms  SHOW FULL FIELDS FROM `whale` 
3.717 721 ms  SHOW VARIABLES WHERE Variable_name = 'character_set_client' 
4.440 728 ms  SHOW TABLES LIKE 'whale' 
5.169 668 ms  SHOW CREATE TABLE `whale` 
5.839 731 ms  SELECT id, `whale`.`name` FROM `whale` 

正如你可以看到,所有的请求需要很长的时间,所以我希望尽量减少他们。我只需要最后的结果。

这是我简单的控制器:

class AnimalsController < ApplicationController 
    def index 
    MicsPix.pluck(:id, :name) 
    render text: 'ok' 
    end 
end 

而且我的模型:

class MicsPix < ActiveRecord::Base 
    establish_connection(:otherdb) 
    def self.table_name 
    "whale" 
    end 
end 

有没有跳过查询比我不使用的解决方案?我不一定要使用ActiveRecord。

回答

1

我不能肯定的额外查询出现在那里,但我对如何删除它们

c = ActiveRecord::Base.establish_connection(
    :adapter => "mysql2", 
    :host  => "localhost", 
    :username => "root", 
    :password => "", 
    :database => "mydatabase" 
) 

sql = "SELECT id, `whale`.`name` FROM `whale`" 
res = c.connection.execute(sql) 

然后重置数据库连接到默认的建议。

此代码适用于我,我只能从外部数据库获取结果,并且只执行查询。当我尝试使用控制器方法时,我做到了这一点,但我认为它在模型中会更整齐一些。据我所知,establish_connection(:otherdb)与我生产我的c时所做的一样。所以我觉得你可以写这样的事情在你的MicsPix

def get_list 
    sql = "SELECT id, `whale`.`name` FROM `whale`" 
    connection.execute(sql) 
end 

这个回报和MySQL资源对象,它是非常相似的阵列但并不完全。

认为 /阿尔宾

+0

+1自己编写SQL的很好的例子。额外的数据库请求使AR能够获取关于数据库的元数据。据推测AR的好处是衡量其成本。如果你只想做一个简单的查询,那么你可以自己生成SQL,如Albin所示。 – 2014-11-04 08:11:55