2010-11-20 11 views
1

カスタムアクティブレコードマクロを実行しようとしています。しかし、今は不可能なようですが、ブロック内からインスタンス変数を設定することができます。ここで私は何をしようとしています。クラスメソッドからインスタンス変数を設定する方法は?

私はinstance_evalを、class_evalメソッド試してみました
module ActiveRecord 
    class Base 
     def self.included(base) 
     base.class.send(:define_method, :my_macro) do |args| 
      # instance_variable_set for the model instance that has called this 
      # macro using args 
     end 
     end 
    end 
end 

..しかし、何も動いていないようにみえたり、私はそれらを使用する方法がありません。

ありがとうございます。

を編集してみましょう。私はクラスメソッドを持っています。クラスのインスタンスがこのメソッドを呼び出します。さて、このクラスメソッドは、インスタンスにインスタンス変数を設定するよう指示する必要があります。

編集 - これは私がOマクロ

class MyModel < ActiveRecord::Base 
    my_macro(*args) 
    def after_initialize 
     # use the value set in the macro as @instance variable 
    end 
end 
+0

Um ... Rubyが「クラスメソッド」という用語を再定義しない限り、クラスメソッドのポイントはインスタンスが存在しないということですか? – delnan

+0

それも私が考えていたものです。インスタンス変数を動的に追加する方法をインスタンスに伝える方法があるかどうかを確認することに興味があります。 –

+0

@greg @delnan:はい..私は完全に同意します...しかし、インスタンス変数をそれ自身に追加することをクラスに指示する方法があるのだろうかと思います。 – ZX12R

答えて

0

を使用するには何を考えている。これは、欲しい方法です:あなたは、次の操作を実行でき

class DynamicAdd 
    def add_method 
    self.class_eval do 
     attr_accessor :some_method 
    end 
    end 
end 

k = DynamicAdd.new 
k.some_method = "hi" 

は、未定義のメソッドエラーになります。

しかし、

k = DynamicAdd.new 
k.add_method 
k.some_method = "hi" 

は動作するはずです。

あなたにもattr_accessors以外の方法の他のタイプを定義するには、この同じフォーマットを使用することができます。

class DynamicAdd 
    def add_method 
    self.class_eval do 
     def some_method 
     return "hi" 
     end 
    end 
    end 
end 
+0

あなたの 'add_method'は通常のメソッドですが、OPのようなクラスメソッドではありません。 –

+0

私はOPがインスタンス変数を追加するためにインスタンスに動的な方法を求めていると思います: "はい..私は完全に同意します...しかし、クラスをインスタンスに追加する方法を教えて自分自身に変数 " –

0

Hmが...()モジュールのメソッドが含まれていませんか?私はあなたが書いたようなクラスでそれを使うことはできないと思います。あなたはクラスメソッドを作成したい場合は、あなたがしたいすべての既存のオブジェクトにインスタンス変数を追加することであるならば、あなたは#instance_variable_set

を使用することができます

class Base 
    def self.my_method 
    end 

または

class Base 
    class << self 
    def my_method 
    end 
    end 

を行うことができます

class Base 
    class << self 
    def my_method(instance_of_base, value) 
     instance_of_base.instance_variable_set "@x", value 
    end 
    end 
end 

a = Base.new 
a.class.send(:my_method, *[a,4]) 
+0

あなたは正しいです。私はそれをインスタンス化するたびにメソッドを送信したくない。私はそれを自動化したい。したがって、マクロ。クラスのインスタンスを引数としてマクロメソッドに送ることは可能ですか? – ZX12R

関連する問題