我試圖做這樣的事情:有沒有辦法在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
但你需要做的一切,你之前的時間由< <
users
添加會返回一個已經覆蓋<<
運營商像Array
,IO
,String
,或您創建任何類型的對象。你重寫這樣的:
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 – 2012-03-02 16:49:15
@JohnBaker,'foo.users << obj'等同於'foo.users.send:<<,obj'。你應該簡單地返回Foo的用戶數組; ['Array#<<'](http://ruby-doc.org/core-1.9.3/Array.html#method-i-3C-3C)方法會將其他用戶推送到數組中。 – 2012-03-02 17:42:01
檢查這個答案: 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
我假設你有一個這樣的模式:
class Account < ActiveRecord::Base
has_and_belongs_to_many :users
end
要覆蓋Account#users<<
,你需要將它定義在一個塊,你傳遞給has_and_belongs_to_many
:
class Account < ActiveRecord::Base
has_and_belongs_to_many :users do
def <<(user)
# ...
end
end
end
你可以通過參考proxy_association.owner
訪問適當的Account
對象:
def <<(user)
account = proxy_association.owner
end
要調用原始Account#users<<
,叫Account#users.concat
:
def <<(user)
account = proxy_association.owner
# user = do_something(user)
account.users.concat(user)
end
有關詳細信息,請參閱本頁面:Association extensions - ActiveRecord
這是'users' Rails的關聯? – lulalala 2012-12-14 06:22:31