2009-05-26 9 views
13

Rubyでインスタンスのアトリビュートへのエイリアスを作成する最良の方法は何ですか(私はレールやルビーの宝石、Rubyのみを使用していません)。
たとえば、以下のクラスを指定すると、:student_name属性アクセサのエイリアスを作成するにはどうすればよいですか?Rubyで属性のエイリアスを作成する最も良い方法は何ですか?

class Student 
    attr_accessor :student_name 
    alias :name :student_name #wrong 
end 

s = Student.new 
s.student_name = "Jordan" 
puts s.name # --> Jordan 
s.name = "Michael" # --> NoMethodError: undefined method `name=' for #<Student:0x572394> ... 

ありがとうございました!ジョンが指摘するように

答えて

25

alias :name :student_name # not wrong, only for getter 
alias :name= :student_name= # add this for setter 
10

を追加するには、リーダライタの両方をエイリアスする必要があります。これはRubyなので、これを処理する独自のエイリアスメソッドを定義するのは簡単です。 Railsの

alias_attribute new_name, old_name

ソースhttp://api.rubyonrails.org/classes/ActiveModel/AttributeMethods/ClassMethods.html#method-i-alias_attribute

ユースケースについては

class Module 
    def attr_alias(new_attr, original) 
    alias_method(new_attr, original) if method_defined? original 
    new_writer = "#{new_attr}=" 
    original_writer = "#{original}=" 
    alias_method(new_writer, original_writer) if method_defined? original_writer 
    end 
end 
+1

私はjusですここではうんざりですが、私はalias_attrをalias_methodと一貫性を持たせるために呼び出すことをお勧めします。この方法では、どちらもalias_thingtoaliasという形式になります。 –

3

もし、最も可能性が高いが、スキーマを変更せずに、既存の壊すことなく、属性名を変更したいとき機能

+0

ありがとう!完璧に動作します! – rusllonrails

関連する問題