मैं PHP dev हूं और फिलहाल मैं रेल (3) और निश्चित रूप से - रूबी सीख रहा हूं। I don't want to believe in magic और इसलिए मैं उन चीज़ों के बारे में जितना समझ सकता हूं जो रेल के पीछे "पीछे" होते हैं। जो मैंने दिलचस्प पाया वह एक्टिव रिकार्ड मॉडल में has_one
या belongs_to
जैसी विधि कॉल करता है।रेल्स विधि "has_one" काम की तरह कैसे कॉल करती है?
मुझे लगता है कि पुन: पेश करने की कोशिश की, और अनुभवहीन उदाहरण के साथ आया था: "यह काम करेगा"
# has_one_test_1.rb
module Foo
class Base
def self.has_one
puts 'Will it work?'
end
end
end
class Model2 < Foo::Base
has_one
end
बस इस फाइल चल उत्पादन होगा, जैसा कि मैंने उम्मीद की थी।
रेल स्रोत के माध्यम से खोज करते समय मुझे जिम्मेदार कार्य मिला: def has_one(association_id, options = {})।
यह कैसे हो सकता है, क्योंकि यह स्पष्ट रूप से एक उदाहरण (?) है और क्लास विधि नहीं है, इसे काम नहीं करना चाहिए।
# has_one_test_2.rb
module Foo
module Bar
module Baz
def has_one stuff
puts "I CAN HAS #{stuff}?"
end
end
def self.included mod
mod.extend(Baz)
end
end
class Base
include Bar
end
end
class Model < Foo::Base
has_one 'CHEEZBURGER'
end
अब चल has_one_test_2.rb
फ़ाइल इच्छा उत्पादन मैं CAN Cheezburger गया है:
कुछ शोध करने के बाद मैं एक उदाहरण है कि एक जवाब हो सकता है पाया। अगर मैं यह अच्छी तरह समझ गया - पहली चीज जो होती है वह यह है कि बेस क्लास बार मॉड्यूल को शामिल करने का प्रयास करता है। इस समावेशन के समय self.included
विधि लागू की गई है, जो बार मॉड्यूल के साथ बार मॉड्यूल (और इसके उदाहरण has_one
विधि) को बढ़ाता है। तो सार has_one
विधि में बेस क्लास में विधि (मिश्रित?) शामिल है। लेकिन फिर भी, मैं इसे पूरी तरह से प्राप्त नहीं करता हूं। Object#extend मॉड्यूल से विधि जोड़ता है लेकिन फिर भी, मुझे यकीन नहीं है कि विस्तार का उपयोग करके इस व्यवहार को पुन: उत्पन्न कैसे करें। तो मेरे प्रश्न हैं:
वास्तव में यहां क्या हुआ। मेरा मतलब है, अभी भी नहीं पता कि has_one विधि क्लास विधि कैसे बनती है? किस भाग ने वास्तव में इसका कारण बनाया?
इस विधि कॉल (जो कॉन्फ़िगरेशन की तरह दिखता है) बनाने की संभावना वास्तव में अच्छी है। क्या यह हासिल करने का कोई वैकल्पिक या आसान तरीका है?