2013-11-24 3 views
10

मैं रेल में एक नौसिखिया हूं और मुझे ActiveRecords संघों में समस्या है।
मैं साधारण किराए पर कार सेवा बना रहा हूं और मैं निम्नलिखित संघों बनाया:रेल संबंधित_to_many

class Client < ActiveRecord::Base 
    has_many :rentals 
    has_many :bookings 
    has_many :cars, :through => :rentals 
    has_many :cars, :through => :bookings 
end 

class Rental < ActiveRecord::Base 
    belongs_to :client, dependent: :destroy 
    has_one :car 
end 

class Booking < ActiveRecord::Base 
    belongs_to :client, dependent: :destroy 
    has_one :car 
end 

मैं क्या जरूरत है एक कार कई बुकिंग और किराये से संबंधित है, जबकि हर बुकिंग और किराए पर लेने की केवल एक ही कार सौंपा हो सकता है।

class Car < ActiveRecord::Base 
    # belongs_to_many :bookings 
    # belongs_to_many :rentals 
end 

मुझे यह कैसे करना चाहिए?

उत्तर

28

यदि किसी कार में कई बुकिंग/किराए पर हो सकते हैं, लेकिन बुकिंग/किराए पर केवल एक कार हो सकती है, तो आप क्लासिक belongs_to/has_many स्थिति देख रहे हैं। ऐसा लगता है कि आप belongs_to और has_one के बीच भेद से छुटकारा पा रहे हैं - यह व्याकरणिक नहीं है, लेकिन आपके डेटाबेस में विदेशी कुंजी कॉलम कहां स्थित है।

  • belongs_to: "मैं इनमें से एक से संबंधित हूं, और मेरे पास विदेशी कुंजी है।"
  • has_one: "मैं इनमें से किसी एक से संबंधित हूं, और इसमें विदेशी कुंजी है।"
  • has_many: "मैं इनमें से कई से संबंधित हूं, और उनके पास विदेशी कुंजी है।"

नोट has_one और has_many दोनों मतलब है कि वहाँ अन्य मॉडल पर एक belongs_to है, क्योंकि ऐसा करना ही एकमात्र विकल्प है, जहां "इस" मॉडल विदेशी कुंजी है है। ध्यान दें कि इसका मतलब है कि has_one का उपयोग तब किया जाना चाहिए जब आपके पास एक-से-एक संबंध हो, एक से अधिक नहीं।

इसे ध्यान में रखते हुए मैं दोनों अपने किराये और बुकिंग मॉडल में belongs_to :car साथ has_one :car की जगह है, और अपने कार के मॉडल में has_many :bookings और has_many :rentals कर देगी। यह भी सुनिश्चित करें कि आपके rentals और bookings तालिकाओं में car_id कॉलम है; आपकी cars तालिका में कोई किराए पर नहीं होना चाहिए- या बुकिंग से संबंधित कॉलम नहीं होना चाहिए।

+0

जैसा कि मैंने कल बताया था, लेकिन मुझे एक पुष्टि की आवश्यकता थी। इसे समझाने के लिए धन्यवाद! – squixy

+0

क्या कोई "मैं इनमें से कई से संबंधित हूं, और मेरे पास विदेशी कुंजी हैं" संबंध? यह क्या है? धन्यवाद! – Ziggy

+2

@ ज़िग्गी, इसमें कोई विकल्प नहीं है जिसमें कई विदेशी कुंजी संग्रहित मॉडल शामिल है, क्योंकि यह मानक SQL कॉलम प्रकारों का उपयोग करके वास्तव में संभव नहीं है। यदि आपके पास कई से अधिक रिश्ते हैं (उदाहरण के लिए पोस्ट में कई टैग हैं, और टैग में कई पोस्ट हैं), तो इसे एक ['है_मनी: थ्रू कॉन्फ़िगरेशन] में एक तीसरे मॉडल (जैसे टैगिंग) द्वारा प्रदर्शित किया जाना चाहिए (http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association)। एक सरल स्पष्टीकरण के लिए – Grantovich

0

आप belong_to_many नहीं कर सकते हैं। सबसे नज़दीक आप वास्तव में प्राप्त कर सकते हैं has_and_belongs_to_many है, लेकिन मुझे यकीन नहीं है कि आप यहां क्या चाहते हैं - जब तक कि आप किराए पर/बुकिंग के लिए कई कारें नहीं ले सकते। पूर्ण स्पष्टीकरण के लिए देखें।

मैं इसे इस तरह ऊपर को बदल देंगे:

class Rental < ActiveRecord::Base 
    belongs_to :client, dependent: :destroy 
    belongs_to :car 
end 

class Booking < ActiveRecord::Base 
    belongs_to :client, dependent: :destroy 
    belongs_to :car 
end 

class Car < ActiveRecord::Base 
    has_many :bookings 
    has_many :rentals 
end 

इसके अलावा, मैं, पता नहीं कैसे अपने किराया बुकिंग से संबंधित हैं, लेकिन मेरी तत्काल सोचा, कि इन दोनों के बीच कुछ संबंध होना चाहिए क्योंकि आप शायद बुकिंग के बिना किराए पर नहीं ले सकते हैं, है ना?

2

हां, रेल में एक "belong_to_many" है, तरह। यह थोड़ा और काम है और आप इसके साथ जनरेटर का उपयोग नहीं कर सकते हैं। इसे polymorphic एसोसिएशन कहा जाता है।

भले ही आप कार बना सकते हैं, & किराया कई बुकिंग हैं, तो आप इसे rentable_vehicle जैसे पॉलिमॉर्फ से बनाकर कार को जोड़ सकते हैं।आपका कोड इस

class Car < ActiveRecord::Base 
    belongs_to :rentable_vehicle, polymorphic: true 
end 

class Rental < ActiveRecord::Base 
    belongs_to :client, dependent: :destroy 
    has_many :cars, as: :rentable_vehicle 
end 

class Booking < ActiveRecord::Base 
    belongs_to :client, dependent: :destroy 
    has_many :cars, as: :rentable_vehicle 
end