2012-03-02 14 views
8

मैं की तरह कुछ करने के लिए कोशिश कर रहा हूँ:क्या रूबी में << ऑपरेटर को ओवरराइड करने का कोई तरीका है?

account.users << User.new 

लेकिन मैं उपयोगकर्ताओं को एक खाते पर एक विधि की जरूरत है। तो मैंने चीजों की कोशिश की है:

def users<<(obj) 

लेकिन मुझे इसके साथ कोई भाग्य नहीं मिला है। क्या रूबी में भी ऐसा करना संभव है? मैं ऐसा इसलिए मानूंगा क्योंकि ActiveRecord संबंध रेल में इस तरह से काम करते प्रतीत होते हैं।

+0

इस 'users' रेल संघ है? – lulalala

उत्तर

1

इस मामले में यह आपके उपयोगकर्ता के << है। तो Array या AssociationProxy हो सकता है।

सबसे सरलतम जो आप चाहते हैं उसे करने के लिए एक नई विधि तैयार करना है।

आप इसके बजाय विधि को ओवरराइड कर सकते हैं।

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

account.users << User.new 
# add 

लेकिन आपको लगता है कि हर समय आप पहले से < <

0

users जोड़ने एक वस्तु है कि Array, IO, String, या किसी भी प्रकार आपके द्वारा बनाए गए तरह << ऑपरेटर अधिरोहित है वापसी होगी कर की जरूरत है। आप इस तरह ओवरराइड:

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.users चाहता हूं << x –

+0

@ जॉनबकर, 'foo.users << obj' 'foo.users.send के बराबर है: <<, obj'। आपको बस उपयोगकर्ताओं के फू की सरणी वापस करनी चाहिए; ['ऐरे # <<'] (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

यदि आप संग्रह में User जोड़ने पर कोई कार्रवाई करने का प्रयास कर रहे हैं, तो आप << पर सवारी करने के बजाय 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

संबंधित मुद्दे