2009-05-20 11 views
6

मेरे पास दो इकाइयों, फ़ीड्स और पोस्ट के बीच एक है_मेनी संबंध है। मेरे पास विशिष्ट प्रकार के पोस्ट, वीडियो और तस्वीरें भी हैं। यह एकल तालिका विरासत का उपयोग कर डेटाबेस में संरचित है।has_many और एकल तालिका विरासत

फ़िलहाल मेरी फ़ीड मॉडल (उपप्रकार सहित)

class Feed < ActiveRecord::Base 
    has_many :posts 
    has_many :photos 
    has_many :videos 

वहाँ एक बेहतर, अधिक पारंपरिक इस निर्दिष्ट करने के लिए रास्ता नहीं है फ़ीड और पोस्ट के बीच एक has_many संबंध निर्दिष्ट है? या मेरे पास जितना आसान हो उतना आसान है?

उत्तर

4

यदि मैं आपको सही ढंग से समझता हूं तो आपके पास पोस्ट और पोस्ट या तो वीडियो या फोटो हो सकते हैं। जैसा कि जैरील ने कहा था कि आपके पास जो कुछ है वह शायद समझने/संभालने में सबसे आसान है, हालांकि यदि आप कल्पना करना चाहते हैं तो आप एकल टेबल विरासत या पॉलिमोफिक संघों का उपयोग कर सकते हैं।

एसटीआई - उदाहरण (चंचल वेब विकास से रेल के साथ 3 संस्करण)

create_table :people, :force => true do |t| 
    t.string :type 

    #common attributes 
    t.string :name 
    t.string :email 

    #attributes for type=Customer 
    t.decimal :balance, :precision => 10, :scale => 2 

    #attributes for type=Employee 
    t.integer :reports_to 
    t.integer :dept 

    #attributes for type=Manager 
    #none 
end 

class Person < ActiveRecord::Base 
end 

class Customer < Person 
end 

class Employee < Person 
    belongs_to :boss, :class_name => "Manager", :foreign_key => :reports_to 
end 

class Manager < Person 
end 

तो अगर आप एक ग्राहक

Customer.create(:name => 'John Doe', :email => '[email protected]', :balance => 78.29) 

आप तो व्यक्ति के माध्यम से इसे प्राप्त कर सकते हैं बनाने के

x = Person.find_by_name('John Doe') 
x.class #=> Customer 
x.email #=> [email protected] 
x.balance #=> 78.29 
x.some_customer_class_method # will work because the Person.find method returned a Customer object 

तो आपके पास

हो सकता है
class Post < ActiveRecord::Base 
end 
class Photo < Post 
end 
class Video < Post 
end 

और फिर आप उन सब को Post.all से मिल सकता है लेकिन

मत भूलना (यदि आप पदों उस फ़ोटो या वीडियो नहीं हैं और बाद वस्तुओं) आप फोटो और वीडियो वस्तुओं वापस मिल जाएगा स्ट्रिंग: अपनी डीबी तालिका में टाइप करें

+1

http://stackoverflow.com/questions/3231889/rails-sti-with-inheriting-children मैं यह पता लगाने की कोशिश कर रहा हूं कि एसटीआई एक बच्चे वस्तु कैसे है, इसलिए दिए गए उदाहरण के साथ मैं " व्यक्ति belong_to: कंपनी "और" कंपनी है_मेनी: व्यक्तियों "? – Rabbott

1

यह बहुत आसान है जो आप कर सकते हैं।

ठीक है, अगर तस्वीरों को वीडियो के समान ही माना जा सकता है, तो शायद आप एसटीआई से दूर हो सकते हैं और विभिन्न प्रकार की सामग्री तक पहुंच प्रदान करने के लिए नामित स्कॉप्स का उपयोग कर सकते हैं।

0

मैं मानता हूं कि प्रश्न में उदाहरण उतना आसान है जितना यह मिलता है। यह पहले ही एसटीआई का उपयोग कर रहा है और संघों को स्पष्ट रूप से बताता है।

इसके अलावा, आप एसटीआई को बाद में निकाल सकते हैं, और विभाजित कर सकते हैं: फोटो और: वीडियो फीड मॉडल के कोड को एक बिट के बदले बिना अपनी अलग टेबल में। स्कोर!

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