2011-10-23 10 views
0

私はPadrino環境を読み込むことなく、既存のデータベース設定を変更することなく、私が書いているカスタムワーカーにPadrinoで使用されるデータベース設定ファイルを活用しようとしています。つまり、既存の構成を変更するのではなく、既存のデータベース構成コードを使用するコードを記述したいと思います。Rubyモジュール内でObjectメソッドを動的に定義するにはどうすればよいですか?

問題のデータベース・コンフィギュレーション・ファイルは、次のようになります。

# This is just here for right now so I can test 
# to see if logger is set to anything in DB config 
puts "Logger in DB config: #{logger}" 

ActiveRecord::Base.configurations[:development] = { 
    :adapter => 'sqlite3', 
    :database => Padrino.root('db', "app_development.db") } 
ActiveRecord::Base.logger = logger 
ActiveRecord::Base.include_root_in_json = true 
ActiveRecord::Base.store_full_sti_class = true 
ActiveSupport.use_standard_json_time_format = true 
ActiveSupport.escape_html_entities_in_json = false 
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations[Padrino.env]) 

マイカスタム労働者は、次のようになります。

ROOT = File.expand_path(File.dirname(__FILE__)) 
$LOAD_PATH.unshift(ROOT) 

require 'active_record' 
require 'logger' 

# Mock Padrino module with methods used by database config file 
module Padrino 
    def self.root(*args) 
    return File.expand_path(File.join("#{ROOT}/..", *args)) 
end 

    def self.env 
    return :development 
    end 
end 

module Worker 
    class << self 
    attr_accessor :logger 

    def init 
     @logger  = Logger.new(STDOUT) 
     @logger.level = Logger::DEBUG 

     require "#{ROOT}/../config/database" 
    end 
    end 
end 

Worker.init 

私は労働者でデータベース構成ファイルを必要とするとき私が得ます

/home/user/devel/app/config/database.rb:3:in `<top (required)>': undefined local variable or method `logger' for main:Object (NameError) 
from /home/user/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:55:in `require' 
from /home/user/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:55:in `require' 
from worker.rb:26:in `init' 
from worker.rb:31:in `<main>' 

この場合、I modにもかかわらず、データベース構成ファイル内のスコープではありません

Logger in Worker module: #<Logger:0x9505088> 
Logger in DB config: 

は私が @loggerを意味するためにこれを取る:

def init 
    @logger  = Logger.new(STDOUT) 
    @logger.level = Logger::DEBUG 

    Object.send(:define_method, :logger, lambda { @logger }) 

    puts "Logger in Worker module: #{logger}" 

    require "#{ROOT}/../config/database" 
end 

この変更は、次のような出力が得られ、次のようにWorker#init機能をified私はObjectでloggerメソッドを定義するときにラムダを使用しています。私はWorker#init機能のうち、コードのObject.sendラインを引くと、私は以下のようにWorker.initを呼び出す直前代わりにそれを呼び出す場合

奇妙なことに、私は次のような結果を得ます。私はWorker#init関数内Object.send呼び出しを行う場合、私は労働者モジュールの外にそれを作る場合にはそれがないようにそれが動作しない理由を

Logger in Worker module: #<Logger:0x81bc8b4> 
Logger in DB config: #<Logger:0x81bc8b4> 

Object.send(:define_method, :logger, lambda { Worker.logger }) 
Worker.init 

結果

は、誰かが私に説明できますか?

+0

私は今度は新しいが、同様の質問に私を導いた私の最初の質問、回避する方法を考え出したので、私は私のオリジナルのポストを編集したことに注意してください私の元の質問の新しいバージョンを反映しています。うまくいけば、この編集/書き換えは、StackOverflowのルールに合っていたはずです。 – Bryan

答えて

0

最初の例では、エラーメッセージからわかるように、未定義の変数 'logger'を使用しようとしています。ロガー機能をこのように使用してみてください:

ActiveRecord::Base.logger = Logger.new(STDOUT) 
+0

提案してくれてありがとうWarHogですが、あなたが提案したことをするために、Padrinoが生成して使用するデータベース設定ファイルを変更する必要があります。それを行う代わりに、私は自分のコードをそれで動作させることによって設定ファイルを使用できるようにしたいと思います(DRYを保つようにして、私がPadrinoアプリケーションのものを変更した場合には私のワーカーのデータベース設定ファイルを更新する必要はありません)。元の質問を更新してこれをもっと明確にしました。 – Bryan

+0

設定ファイルで動作するコードを共有できますか? – WarHog

+0

WarHog、私は最初の質問の周りに道を見つけ出しましたが、これは新しい、しかし同様の質問に私を導いたので、オリジナルの質問の新しい版を反映するために元の投稿を編集しました。 – Bryan

関連する問題