【问题标题】:undefined method `explain' for #<ActiveRecord::ConnectionAdapters::MysqlAdapter#<ActiveRecord::ConnectionAdapters::MysqlAdapter 的未定义方法“解释”
【发布时间】:2012-01-29 23:44:54
【问题描述】:

我是 Ruby on Rails 的新手,但我已经学习了一些教程,并且对自己的方法有所了解。我已经生成了一些脚手架并将数据插入到 MySql 数据库中。

导航到 index.html.erb 时,我在标题中收到错误

控制器正在执行索引

  def index
    @beers = Beer.all

    respond_to do |format|
      format.html # index.html.erb
      format.json { render :json => @beers }
    end
  end

并且有这个结构

Beer: id, brewer_id, name, price, score, color, brew_type, create_at, updated_at

RoR 正在为我创建的其他脚手架工作,并列出数据。我在 mysql 中为实体 Beer 更新了结构,它可能没有反映 rails 的变化(不知道)。

我需要不同的 gem 来将 rails 连接到 mysql 数据库吗?任何有关检查内容的建议将不胜感激(:

【问题讨论】:

  • "我更新了mysql中的结构..." 你做了什么改变?
  • 我在 brewer_id 上添加了一个索引,以便我可以使用外键并将其链接回 brewer 实体的 id。将 created_at 和 updated_at 更改为时间戳(从日期时间更改)。首先将“brew_type”标记为“type”,但意识到“type”是一个保留标题(我在 index.html.erb 中反映了这个“type”更改)

标签: mysql ruby-on-rails rubygems ruby-on-rails-3.2 rails-activerecord


【解决方案1】:

我猜您使用的是 Rails 3.2,并且您的 Beer.all 调用时间过长。来自3.2 release notes

运行时间超过半秒的查询会在开发模式中自动解释。当然,这个阈值是可以改变的。

如果我们查看MySQL adapter for Rails,则没有explain 方法。但是,MySQL2 adapter 确实理解 explain

首先,您可能需要更少的啤酒或一些分页。然后,您应该尝试切换到 MySQL2 适配器;只需通过编辑您的Gemfile 来安装新适配器以使用mysql2,运行bundle 以设置新的东西,然后将您的database.yml 更改为看起来更像这样:

development:
  adapter: mysql2

【讨论】:

  • 噢!我会试试新的适配器,现在我的列表中大约有 6000 个
  • 是的,这解决了它。现在使用mysql2。你是对的,它需要超过 1/2 秒。我现在正处于开发阶段,并且会有一些分页。谢谢!
  • 我有另一个需要旧版本 mysql 的 gem (twitter)。我该如何解决?
  • @singhspk:修补 gem 以使用 mysql2 或通过在 config/environments/development.rb 中设置 config.active_record.auto_explain_threshold_in_seconds = nil 来禁用自动解释。将 gem 修复为需要 mysql 或 mysql2 是最有意义的。
  • 你几乎没有得到我的+1,因为“首先,你可能需要更少的啤酒......”这句话。那是什么样的解决方案? ;-)
猜你喜欢
  • 1970-01-01
  • 2016-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-07
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
相关资源
最近更新 更多