5

मेरे पास Blockable मॉड्यूल है जिसमें कुछ अन्य ActiveRecord कक्षाओं में शामिल होने के लिए एसोसिएशन और विधियां शामिल हैं।रेल: मैं अपने एआर मॉडल में शामिल होने वाले मॉड्यूल में एक एसोसिएशन एक्सटेंशन कैसे परिभाषित करूं?

प्रासंगिक कोड:

module Blockable 
    def self.included(base) 
    base.has_many :blocks 
    end 
end 

मैं एक संघ एक्सटेंशन जोड़ना चाहते हैं। सामान्य वाक्य रचना (यानी जब मैं एक मॉड्यूल में संघ को परिभाषित नहीं कर रहा हूँ) इस तरह है: जब मॉड्यूल जो ए.आर. मॉडल में शामिल है में प्रयोग किया जाता

# definition in Model < ActiveRecord::Base 
has_many :blocks do 
    def method_name 
    ... code ... 
    end 
end 

# usage 
Model.first.blocks.method_name 

इस वाक्य रचना काम नहीं करता। मुझे undefined method 'method_name' for #<ActiveRecord::Relation:0xa16b714> मिलता है।

कोई भी विचार मुझे अन्य एआर कक्षाओं में शामिल करने के लिए मॉड्यूल में एक एसोसिएशन एक्सटेंशन को परिभाषित करने के बारे में कैसे जाना चाहिए?

+2

आपका मॉड्यूल ठीक दिखता है, ऐसा लगता है कि आप इसे गलत तरीके से कॉल कर रहे हैं। 'Model.blocks' काम नहीं करना चाहिए। आप इसे किसी ऑब्जेक्ट पर कॉल कर रहे हैं और उस ऑब्जेक्ट का उदाहरण नहीं। 'Model.first.blocks.method_name' आज़माएं। –

+0

क्षमा करें, मेरे द्वारा असफल उदाहरण। मैं इसे एक उदाहरण पर कॉल करने की कोशिश कर रहा हूं - मैंने इसे ठीक करने के लिए अपना प्रश्न अपडेट कर दिया है। – nfm

उत्तर

2

अरघ, मैं चूसना।

मेरे पास एक असंबंधित बग था जो एसोसिएशन एक्सटेंशन को तोड़ने का कारण बन रहा था।

मैं सत्यापित है कि अपने मूल विधि और रेल 3.0.3 के तहत जेवियर होल्ट की विधि काम दोनों है

self.included(base) 
    base.has_many :blocks do 
    def method 
     ... 
    end 
    end 
end 

# OR 

self.included(base) 
    base.class_eval do 
    has_many :blocks do 
     def method 
     ... 
     end 
    end 
    end 
end 
4

मेरे पास इस समय मेरे रेल कोड (2.3.8) में कुछ समान काम है। वैसे भी कि spacebarring का एक बहुत था ...

, वह मेरे लिए काम करता है - -

module Blockable 
    self.included(base) 
     base.class_eval do 
      has_many :blocks do 
       def method_name 
        # ...stuff... 
       end 
      end 
     end 
    end 
end 

वाह उम्मीद है कि यह भी आपके लिए काम करेगा: मैं base.class_eval बल्कि base.has_many से इस्तेमाल किया!

+0

लुक-इन के लिए धन्यवाद और कोशिश करने के लिए मुझे एक और तरीका दे रहा है। बाहर निकलता है मैं कहीं और खराब हो जाता हूं और दोनों दृष्टिकोण काम करते हैं! – nfm

7

रेल 3 इस के लिए कुछ सहायक तरीकों है। यह उदाहरण The Rails 3 Way, 2nd Edition से है:

module Commentable 
    extend ActiveSupport::Concern 
    included do 
    has_many :comments, :as => :commentable 
    end 
end