Rails :: Railtie: مشكلة في إنشاء Rails 3 Gem
-
02-10-2019 - |
سؤال
يمكنني حقًا استخدام مجموعة أخرى من العيون على هذا ، لذا اعتقدت أنني سأقوم بنشرها هنا. منذ فترة كتبت امتدادًا أساسيًا لـ ActivereCord لأغطيتي التعليمية. لقد قرأت عن Railties مؤخرًا واعتقدت أنني سأحاول تشغيلها مع Rails 3. اعتقدت أنني سأقوم بتجميعها كجوهرة للتعرف على هذه العملية أيضًا. إذا تخطيت Railtie وقمت بذلك فقط كقرود تقليدي في مجلد المهيئات ، فإنه يعمل بشكل جيد. باستخدام Railtie ... لا شيء.
من مظهره ، لم يتم تنفيذ Railtie الخاص بي أبدًا ، وبالتالي يبدو أنه لا شيء آخر يحدث.
هل يرى أي شخص أي خطأ هنا؟
أي اقتراحات لأفضل الممارسات أو التحسينات نرحب أيضًا.
مشروع Gemfile:
gem 'sql_explain', :path => "/home/mike/projects/sql_explain/"
Gemspec:
...
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
المحلول
يبدو أنك قد حصلت بالفعل على هذا ، ولكن تذكر أنه مع Rails 3 يمكنك القيام به:
ActiveSupport.on_load :active_record do
ActiveRecord::ConnectionAdapters::MysqlAdapter.include SqlExplain::AR
end
سيضمن ذلك أن يتم إطلاق تشملك إلا بعد تحميل ActivereCord.
نصائح أخرى
هل أنت متأكد من أن هذا صحيح؟:
if defined?(ActiveRecord)
أفترض أنها خاطئة. بدلاً من "القضبان" ، حاول أن تتطلب "القضبان/كلها" - الأول لا يتم تحميل AR.