4

私は本当にこれに別の目を使うことができたので、ここに投稿すると思いました. 少し前に、自分の教育目的で基本的な 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
4

2 に答える 2

3

これはすでに整理されているように見えますが、Rails 3 では次のことができることを覚えておいてください。

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

これにより、ActiveRecord がロードされた後にのみインクルードが実行されるようになります。

于 2010-09-27T02:16:02.513 に答える
1

これは本当ですか?:

if defined?(ActiveRecord)

私はそれが間違っていると思います。「rails」の代わりに「rails/all」を要求してみてください - 最初のものはARをロードしていません。

于 2010-09-13T20:58:43.380 に答える