2009-11-14 8 views
5

क्या यह रिश्ता है जो रूबी में Activesecord मॉडल संबंधों पर रूबी में वर्णित किया जा सकता है?क्या इस रिश्ते को रेल पर रूबी में वर्णित किया जा सकता है?

Customer       Address 
    ===================    ========= 
    Billing_Address_Id >------} 
           }---|- AddressId 
    Shipping_Address_Id >------} 

मुझे लगता है कि इस तरह दिखता है डेटा हो सकता था ताकि:

पता:

Id | Addr   | City  | State | Zip | 
    ================================================ 
    1 | 123 Main  | New York | NY | 99999 | 
    2 | 200 2nd Street | New York | NY | 99999 | 
    3 | 300 3rd Street | Albany | NY | 99998 | 
    4 | PO Box 4  | Albany | NY | 99998 | 

ग्राहक:

Id | Name | Billing_Address_Id | Shipping_Address_Id | 
    ======================================================= 
    1 | Bob | 1     | 1     | 
    2 | Al | 2     | 1     | 
    3 | Joe | 3     | 4     | 

मैं अपने खुद के तालिका में पते संग्रहीत करना चाहते हैं क्योंकि डेटा ग्राहकों (विशेष रूप से शिपिंग पता) में साझा किया जा सकता है। लेकिन किसी दिए गए ग्राहक के लिए केवल दो पते होंगे।

मैं कई से अधिक रिश्तों से बचना चाहता हूं जब तक कि कोई अन्य तरीका न हो।

उत्तर

2

इस तरह देखते हुए मेज परिभाषाएँ:

create_table :addresses do |t| 
    t.string :street 
    t.string :city 
    t.string :state 
    t.string :zip 
    t.timestamps 
end 

create_table :customers do |t| 
    t.string  :name 
    t.references :shipping_address 
    t.references :billing_address 
    t.timestamps 
end 

आप इस तरह अपने ग्राहकों के साथ एक बिलिंग और शिपिंग पते को संबद्ध कर सकते हैं:

class Customer < ActiveRecord::Base 
    belongs_to :shipping_address, :class_name => "Address" 
    belongs_to :billing_address, :class_name => "Address" 
end 
+0

तालिका डिजाइन में मदद मिलेगी। मुझे "डेटा प्रकार" संदर्भों से अवगत नहीं था। – y0mbo

5

हाँ, यह है कि ऐसा करने के लिए पूरी तरह से संभव है। दो विदेशी कुंजी shipping_address_id और addresses मेज पर के साथ एक customers तालिका को देखते हुए, अपने Customer मॉडल ऐसा दिखाई दे सकता:

class Customer < ActiveRecord::Base 
    belongs_to :billing_address, :class_name => 'Address' 
    belongs_to :shipping_address, :class_name => 'Address' 
end 

यह शिपिंग और बिलिंग पते के लिए एक ग्राहक संदर्भ में एक ही पते पंक्ति दूँगी, और होगा कई ग्राहकों को पते साझा करने दें।

अद्यतन: इस तरह के पते पर संदर्भ साझा करते समय आप शायद सावधानीपूर्वक विचार करना चाहते हैं कि पता अपडेट कैसे प्रबंधित करें। आपके उदाहरण में, बॉब और अल एक ही शिपिंग पता साझा करते हैं। अब, यदि बॉब अपने शिपिंग पते को अपडेट करता है तो शायद आप अल के पते को बदलने से बचने के लिए मौजूदा रिकॉर्ड को अपडेट करने के बजाय बॉब के नए पते के लिए नया Address रिकॉर्ड बनाना चाहते हैं। कभी-कभी, आप वास्तव में इस स्थिति में दोनों ग्राहकों के पते को अपडेट करना चाहते हैं, लेकिन ज्यादातर मामलों में आप शायद नहीं करते हैं।

+0

मैं आपके डिजाइन मूल्यांकन से सहमत हूं। मेरा उदाहरण थोड़ा सा सरल है जो मैं वास्तव में करूँगा; ग्राहक वास्तव में एक ही घर में एक ही खाते का हिस्सा होंगे। वे एक ही पता साझा कर सकते हैं, या एक अलग स्थान पर शिपिंग चाहते हैं। – y0mbo

0

The documentation for ActiveRecord associations has a section on has_one vs belongs_to. इसके अलावा, section on has_one कहा गया है कि यह केवल इस्तेमाल किया जाना चाहिए अगर अन्य वर्ग विदेशी कुंजी है। तो, आप जो चाहते हैं उसे मॉडल करने के लिए, आप इसका उपयोग करेंगे।

class Address < ActiveRecord::Base 
    has_one :shipto_customer, :class_name => "Customer", :foreign_key => "shipping_address_id" 
    has_one :billto_customer, :class_name => "Customer", :foreign_key => "billing_address_id" 
end 

class Customer < ActiveRecord::Base 
    belongs_to :shipping_address, :class_name => "Address" 
    belongs_to :billing_address, :class_name => "Address" 
end 

उदाहरण उपयोग:

>> customer = Customer.new(:name => "John Smith", 
?>  :shipping_address => Address.new(:address => "123 M St", 
?>  :city => "Phoenix", :state => "AZ", :zip => "85015"), 
?>  :billing_address => Address.new(:address => "555 W Main Dr", 
?>  :city => "Phoenix", :state => "AZ", :zip => "85015") 
>> ) 
=> #<Customer id: nil, name: "John Smith", billing_address_id: nil, shipping_address_id: nil, created_at: nil, updated_at: nil> 
>> customer.save 
    Address Create (0.8ms) INSERT INTO "addresses" ("address", "city", "zip", "created_at", "updated_at", "state") VALUES('555 W Main Dr', 'Phoenix', '85015', '2009-11-14 17:03:28', '2009-11-14 17:03:28', 'AZ') 
    Address Create (0.2ms) INSERT INTO "addresses" ("address", "city", "zip", "created_at", "updated_at", "state") VALUES('123 M St', 'Phoenix', '85015', '2009-11-14 17:03:28', '2009-11-14 17:03:28', 'AZ') 
    Customer Create (0.2ms) INSERT INTO "customers" ("name", "billing_address_id", "shipping_address_id", "created_at", "updated_at") VALUES('John Smith', 1, 2, '2009-11-14 17:03:28', '2009-11-14 17:03:28') 
=> true 
>> customer.shipping_address 
=> #<Address id: 2, address: "123 M St", city: "Phoenix", state: "AZ", zip: "85015", created_at: "2009-11-14 17:03:28", updated_at: "2009-11-14 17:03:28"> 
>> customer.billing_address 
=> #<Address id: 1, address: "555 W Main Dr", city: "Phoenix", state: "AZ", zip: "85015", created_at: "2009-11-14 17:03:28", updated_at: "2009-11-14 17:03:28"> 
>> 
+0

ओपी ग्राहकों के बीच पतों को साझा करने में सक्षम होना चाहता था, इसलिए 'पता' मॉडल में रिश्तों को 'है_ऑन' संबंधों के बजाय' has_many' होना चाहिए। –

+0

यह ओपी के पोस्ट से काफी स्पष्ट नहीं लगता है, डेटा उदाहरण में वह पते को साझा किया जा रहा है, यानी: has_many, कोड उदाहरण में वह सुझाव दे रहा है। फिर वह कहता है कि उसके पास बहुत से लोग नहीं होंगे। मेरी राय में, साझा पते एक बुरा विचार होगा। क्या होता है जब ग्राहक ए एक ज़िप + 4, या एक Apt संख्या जोड़ने के लिए अपने वर्तमान पते को अद्यतन करता है? –

+0

हां, साझा पते निश्चित रूप से परेशानी हैं। अलग-अलग तालिकाओं में पते और ग्राहकों को रखना संभवतः स्पष्टता के लिए एक अच्छा विचार है, लेकिन पता पंक्तियों के संदर्भ साझा करने से पता चलता है कि पता अपडेट कैसे प्रबंधित करें। –

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