2012-02-20 15 views
1

私はいくつかの属性メソッドの省略名をエイリアスにしたいクラス定義を持っています。例えばなど "PR" と "価格"、および:Ruby:クラス定義でインスタンスメソッドを動的に定義しようとしています:なぜdefine_methodの使用はalias_methodではなく動作しますか?

次の実装が機能:

class Fruit < ActiveRecord::Base 
    ABBREVS = {:price=>:pr, :country=>:ct} 
    ABBREVS.each_pair{|k,v| define_method(v){ self.send(k) } } 
end 

はしかし、define_methodは右、あまりにも...重い利きそうですか? alias_methodも同じではありませんか?

NameError: undefined method `price' for class `Fruit' 

どうやら、Rubyは私がクラスメソッドではなく、インスタンスメソッドの別名しようとしていると考えて:私はこれを行うと

class Fruit < ActiveRecord::Base 
    ABBREVS = {:price=>:pr, :country=>:ct} 
    ABBREVS.each_pair{|k,v| alias_method(v, k) } 
end 

は、しかし、私はクラスのこの種のエラーを取得します。ここで間違ったalias_methodを使っていますか?

+1

なぜこれをやりたいですか?意図的に読みやすさを減らすには? – Russell

答えて

2

まだ定義されていないメソッドのエイリアスを試みていると思います。私はActiveRecordの機能を理解していませんが、スキーマはコードに定義されていませんが、データベース内で定義されていないため、スキーマを取得するために初めてデータベースにアクセスするまでアクセサメソッドが定義されていないと思われます。あなたのalias_methodコールの後にしてください。

しかし、私はあなたがこれを行う必要があるとは思わない!長い名前を入力するだけです!

+0

文脈上の理由から、これをJavaScriptに出力するときの省略形は、データベーススキーマとのマッピングを維持しながらクライアント側のダウンロードを最小限に抑える方法です。 – Zando

+0

私が想像している(しかし、テストなしではわからない)多くの仕事や多くの潜在的なバグ、そしてコードをデバッグするのがはるかに難しいように思えますが、パフォーマンスは非常に低いはずです。 – Russell

関連する問題