2012-03-02 435 views
8

我試圖做這樣的事情:有沒有辦法在Ruby中覆蓋<<運算符?

account.users << User.new 

但我需要的用戶是在一個賬戶的方法。所以我嘗試過這樣的事情:

def users<<(obj) 

但是我沒有這樣的運氣。這甚至有可能在Ruby中做到?我會這樣認爲,因爲ActiveRecord關係似乎在Rails中以這種方式工作。

+0

這是'users' Rails的關聯? – lulalala 2012-12-14 06:22:31

回答

1

在這種情況下,你的班級的用戶是<<。所以可以是ArrayAssociationProxy

最簡單的是創建一個新的方法來做你想做的。

您可以改爲通過實例覆蓋方法。

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

account.users << User.new 
# add 

但你需要做的一切,你之前的時間由< <

0

users添加會返回一個已經覆蓋<<運營商像ArrayIOString,或您創建任何類型的對象。你重寫這樣的:

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 – 2012-03-02 16:49:15

+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)方法會將其他用戶推送到數組中。 – 2012-03-02 17:42:01

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

我假設你有一個這樣的模式:

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

相關問題