【问题标题】:Rails::Railtie: Trouble creating a Rails 3 gemRails::Railtie:创建 Rails 3 gem 时遇到问题
【发布时间】:2010-09-13 16:40:56
【问题描述】:

我真的可以用另一双眼睛来看待这个,所以我想我会把它贴在这里。 不久前,我为自己的教育目的编写了一个基本的 ActiveRecord 扩展。我最近一直在阅读有关 Railties 的文章,并认为我会尝试让它与 Rails 3 一起使用。我想我会把它打包成一个 gem 来了解这个过程。 如果我跳过 Railtie,只是在初始化程序文件夹中将其作为传统的猴子补丁执行,则它可以正常工作。使用 Railtie……什么都没有。

从外观上看,我的 Railtie 从未执行过,因此似乎没有其他任何事情发生。

有没有人看到这里有什么问题?

也欢迎任何有关最佳做法或改进的建议。

项目 Gemfile:

gem 'sql_explain', :path => "/home/mike/projects/sql_explain/"

宝石规格:

...
  spec.files = %w(README.rdoc sql_explain.rb lib/sql_explain.rb lib/railtie.rb sql_explain.gemspec)
...

sql_explain.rb

require 'lib/railtie.rb'

railtie.rb

require 'active_record'
require 'sql_explain'

module SqlExplain
  class Railtie < Rails::Railtie
    railtie_name :sql_explain
    initializer 'sql_explain.extend.activerecord' do
      if defined?(ActiveRecord)
        ActiveRecord::ConnectionAdapters::MysqlAdapter.include SqlExplain::AR
      end
    end
  end
end

sql_explain.rb

module SqlExplain
  module AR
    def self.included(base_klass)
      base_klass.send :alias_method_chain, :select, :explain
    end


    def select_with_explain(sql, name = nil)
      @connection.query_with_result = true
      result = execute('explain ' + sql, :skip_logging)
      rows = []
      result.each_hash { |row| rows << row }
      result.free
      @connection.more_results && @connection.next_result    # invoking stored procedures with CLIENT_MULTI_RESULTS requires this to tidy up else connection will be dropped
      exp_string = ""
      rows.each{|row| row.each_pair{|k,v| exp_string += " #{k}: #{v} |"}}
      log(exp_string, "Explanation") {}
      select_without_explain(sql, name)
    end
  end
end

【问题讨论】:

    标签: ruby-on-rails ruby rubygems railtie


    【解决方案1】:

    看起来您已经解决了这个问题,但请记住,使用 Rails 3 您可以做到:

    ActiveSupport.on_load :active_record do
      ActiveRecord::ConnectionAdapters::MysqlAdapter.include SqlExplain::AR
    end
    

    这将确保只有在加载 ActiveRecord 后才会触发您的包含。

    【讨论】:

    • 我永远无法在我的 railtie 中触发初始化方法。有什么建议吗?
    • 我没有发现任何问题。你确定 Railtie 本身正在加载吗?
    • 铁路是。 railtie 内的 ActiveSupport.onload 工作正常。初始化程序块中的任何内容都不会触发。文档使它看起来像是被自动调用...
    【解决方案2】:

    你确定这是真的吗?:

    if defined?(ActiveRecord)
    

    我想这是错误的。而不是“rails”,而是尝试要求“rails/all”——第一个没有加载 AR。

    【讨论】:

    • 感谢 gertas,我再次查看了需求,我认为我现在已经做了正确的事情......也许吧。
    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2012-04-24
    • 1970-01-01
    相关资源
    最近更新 更多