2012-03-02 8 views
8

私のような何かやろうとしている:Rubyの<<演算子をオーバーライドする方法はありますか?

account.users << User.new 

をしかし、私は、ユーザーがアカウントの方法であることが必要です。だから私は次のようなものを試しました:

def users<<(obj) 

しかし、私はそれに運がなかった。これはRubyでも可能ですか? ActiveRecordの関係がRailsでこのように動作するように思われるので、私はそう仮定します。

+0

は、この 'users'レール協会ですか? – lulalala

答えて

1

この場合、あなたのユーザーのクラス<<です。したがってArrayまたはAssociationProxyになります。

最も簡単なことは、あなたが望むことをするための新しい方法を作成することです。

代わりにインスタンスでメソッドをオーバーライドできます。

account.users.instance_eval do 
    def <<(x) 
    put 'add' 
    end 
end 

account.users << User.new 
# add 

は、しかし、あなたはあなたの前にすべての時間がArrayIOString、または作成した任意の型のような<<演算子をオーバーライドしているオブジェクトを返します< <

0

usersで追加することを行う必要があります。あなたはあなたの実際の問題を記述していない可能性がありますように

class SomeType 
    def <<(obj) 
    puts "Appending #{obj}" 
    end 
end 
5

に思えますが、あなたの質問に答えるために - はいあなたは<<演算子オーバーライドすることができます:あなたはこのように上書き

class Foo 
    def <<(x) 
    puts "hi! #{x}" 
    end 
end 

f = Foo.new 
=> #<Foo:0x00000009b389f0> 
> f << "there" 
hi! there 
+0

私はFooクラスを使いたくないです。私はユーザfoo.usersにしたい<< x –

+0

@ JohnBaker、 'foo.users << obj'は' foo.users.send:<<、obj'と同じです。あなたは単にFooのユーザーの配列を返す必要があります。 ['Array#<< '](http://ruby-doc.org/core-1.9.3/Array.html#method-i-3C-3C)メソッドは、追加のユーザーを配列に押し込みます。 –

8

チェックこの回答を: Rails: Overriding ActiveRecord association method

[このコードは将来の捜索のために、ここで、他の回答から、完全である]

has_many :tags, :through => :taggings, :order => :name do 
    def << (value) 
     "overriden" #your code here 
    end  
    end 
0

Userusersコレクションに追加するときにアクションを実行する場合は、<<をオーバーライディングする代わりにassociation callbacksを使用できます(オブジェクトをアソシエーションに追加する方法が多数あるため)。

class Account 
    has_many :users, :after_add => :on_user_add 

    def on_user_add(user) 
    p "Added user : #{user.name} to the account: #{name}" 
    end 
end 
1

私はあなたがこのようなモデルがあるとしますAccount#users<<を上書きする

class Account < ActiveRecord::Base 
    has_and_belongs_to_many :users 
end 

を、あなたはhas_and_belongs_to_manyに渡すブロックでそれを定義する必要があります。

class Account < ActiveRecord::Base 
    has_and_belongs_to_many :users do 
    def <<(user) 
     # ... 
    end 
    end 
end 

あなたはすることができます適切なAccountオブジェクトにアクセスするには、proxy_association.owner

Account#users<<を呼び出すために
def <<(user) 
    account = proxy_association.owner 
end 

Account#users.concatを呼び出します。詳細については

def <<(user) 
    account = proxy_association.owner 
    # user = do_something(user) 
    account.users.concat(user) 
end 

、このページを参照してください。Association extensions - ActiveRecord

関連する問題