वहाँ उन दो तरीकों कि सभी अन्य उत्तर याद कर रहे हैं के बीच एक मौलिक अंतर है, और कहा कि एसटीआई से रेलों 'कार्यान्वयन (सिंगल टेबल विरासत) है:
http://api.rubyonrails.org/classes/ActiveRecord/Base.html ("एकल टेबल विरासत" अनुभाग ढूंढें)
मूल रूप से, अगर आप इस तरह अपने बेस वर्ग refactor:
class Base < ActiveRecord::Base
def foo
puts "foo"
end
end
class A < Base
end
class B < Base
end
उसके बाद, आप "ठिकानों" कहा जाता है एक डेटाबेस तालिका के लिए, किसी स्तंभ "प्रकार" कहा जाता है, जो "का मान होना चाहिए साथ अपेक्षा की जाती है एक "या" बी '। इस तालिका के कॉलम आपके सभी मॉडलों में समान होंगे, और यदि आपके पास एक स्तंभ है जो केवल मॉडल में से एक है, तो आपके "बेस" तालिका को denormalized किया जाएगा।
जबकि, अगर आप इस तरह अपने बेस वर्ग refactor:
Module Base
def foo
puts "foo"
end
end
class A < ActiveRecord::Base
include Base
end
class B < ActiveRecord::Base
include Base
end
तो फिर वहाँ कोई तालिका "ठिकानों" हो जाएगा। इसके बजाए, एक टेबल "एएस" और एक टेबल "बीएस" होगी। यदि उनके पास समान गुण हैं, तो स्तंभों को दोनों तालिकाओं में डुप्लिकेट करना होगा, लेकिन यदि अंतर हैं, तो उन्हें denomarlized नहीं किया जाएगा।
तो, यदि कोई दूसरे पर बेहतर है, हाँ, लेकिन यह आपके आवेदन के लिए विशिष्ट है। अंगूठे के नियम के रूप में, यदि उनके पास समान गुण या बड़े ओवरलैप हैं, तो एसटीआई (पहला उदाहरण) का उपयोग करें, अन्यथा, मॉड्यूल का उपयोग करें (दूसरा उदाहरण)।
क्या आप बेस क्लास उदाहरण में उप-वर्गों में foo की परिभाषा को शामिल करना चाहते थे? –
नहीं मैंने नहीं किया। धन्यवाद। मैंने इसे हटा दिया। –