私のような何かやろうとしている:Rubyの<<演算子をオーバーライドする方法はありますか?
account.users << User.new
をしかし、私は、ユーザーがアカウントの方法であることが必要です。だから私は次のようなものを試しました:
def users<<(obj)
しかし、私はそれに運がなかった。これはRubyでも可能ですか? ActiveRecordの関係がRailsでこのように動作するように思われるので、私はそう仮定します。
私のような何かやろうとしている:Rubyの<<演算子をオーバーライドする方法はありますか?
account.users << User.new
をしかし、私は、ユーザーがアカウントの方法であることが必要です。だから私は次のようなものを試しました:
def users<<(obj)
しかし、私はそれに運がなかった。これはRubyでも可能ですか? ActiveRecordの関係がRailsでこのように動作するように思われるので、私はそう仮定します。
この場合、あなたのユーザーのクラス<<
です。したがってArray
またはAssociationProxy
になります。
最も簡単なことは、あなたが望むことをするための新しい方法を作成することです。
代わりにインスタンスでメソッドをオーバーライドできます。
account.users.instance_eval do
def <<(x)
put 'add'
end
end
account.users << User.new
# add
は、しかし、あなたはあなたの前にすべての時間がArray
、IO
、String
、または作成した任意の型のような<<
演算子をオーバーライドしているオブジェクトを返します< <
users
で追加することを行う必要があります。あなたはあなたの実際の問題を記述していない可能性がありますように
class SomeType
def <<(obj)
puts "Appending #{obj}"
end
end
に思えますが、あなたの質問に答えるために - はいあなたは<<
演算子オーバーライドすることができます:あなたはこのように上書き
class Foo
def <<(x)
puts "hi! #{x}"
end
end
f = Foo.new
=> #<Foo:0x00000009b389f0>
> f << "there"
hi! there
私はFooクラスを使いたくないです。私はユーザfoo.usersにしたい<< x –
@ JohnBaker、 'foo.users << obj'は' foo.users.send:<<、obj'と同じです。あなたは単にFooのユーザーの配列を返す必要があります。 ['Array#<< '](http://ruby-doc.org/core-1.9.3/Array.html#method-i-3C-3C)メソッドは、追加のユーザーを配列に押し込みます。 –
チェックこの回答を: Rails: Overriding ActiveRecord association method
[このコードは将来の捜索のために、ここで、他の回答から、完全である]
has_many :tags, :through => :taggings, :order => :name do
def << (value)
"overriden" #your code here
end
end
User
をusers
コレクションに追加するときにアクションを実行する場合は、<<
をオーバーライディングする代わりに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
私はあなたがこのようなモデルがあるとします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
は、この 'users'レール協会ですか? – lulalala