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