免除ActiveRecord提出的额外请求

时间:2014-10-26 20:28:48

标签: ruby-on-rails ruby activerecord

在rails应用程序中,我在外部数据库上做了一些请求。在newrelic中,当我查看SQL请求时,我有这个:

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 个答案:

答案 0 :(得分: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)

然后将db连接重置为默认值。

此代码适用于我,我可以从外部数据库获取结果,只执行查询。当我试用它时,我在控制器方法中做到了这一点,但我认为它在模型中会更加整洁。据我所知,establish_connection(:otherdb)与我制作c时的情况相同。所以我认为你可以在你的MicsPix中写下这样的东西

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

这会返回和mysql res对象,它与数组非常相似但不完全相同。

问候 /阿尔宾