2010-12-29 15 views
8

मैं चार अलग-अलग उपयोगकर्ता प्रकारों: व्यवस्थापक, कर्मचारी, निर्माता, ट्रांसपोर्टर के साथ एक सूची प्रबंधन अनुप्रयोग बना रहा हूं। मैं अभी तक कोडिंग शुरू नहीं किया है, लेकिन यह है कि मैं क्या सोच रहा हूँ .. निर्माता और ट्रांसपोर्टरों has_many के साथ संबंधित हैं: के माध्यम से कई करने के लिए कई उत्पादों के साथ मिलकर इस प्रकार है:रेल पर रूबी में एकाधिक उपयोगकर्ता भूमिकाएं

class Manufacturer < ActiveRecord::Base 
has_many :products 
has_many :transporters, :through => :products 
end 

class Product < ActiveRecord::Base 
belongs_to :manufacturer 
belongs_to :transporter 
end 

class Transporter < ActiveRecord::Base 
has_many :products 
has_many :manufacturers, :through => :products 
end 

सभी चार उपयोगकर्ता प्रकार होगा लॉगिन करने में सक्षम हो, लेकिन उनके पास अलग-अलग अनुमतियां और विचार होंगे, आदि। मुझे नहीं लगता कि मैं उन्हें एक ही तालिका (उपयोगकर्ता) में डाल सकता हूं, हालांकि, उनके पास अलग-अलग आवश्यकताएं होंगी, यानी: विक्रेताओं और निर्माताओं के पास होना चाहिए बिलिंग पता और संपर्क जानकारी (सत्यापन के माध्यम से), लेकिन व्यवस्थापक और कर्मचारियों के पास ये फ़ील्ड नहीं होना चाहिए।

यदि संभव हो, तो मैं 4 अलग-अलग स्क्रीन के विपरीत एक एकल लॉगिन स्क्रीन चाहूंगा।

मैं इसे बनाने के लिए सटीक कोड नहीं मांग रहा हूं, लेकिन मुझे ऐसा करने का सबसे अच्छा तरीका निर्धारित करने में समस्या हो रही है। किसी भी विचार की सराहना की जाएगी - धन्यवाद!

उत्तर

5

आपका बुनियादी दृष्टिकोण उचित लगता है को संदर्भित करने के बहुरूपी बनाते हैं। मैं आपको सलाह देता हूं कि उपयोगकर्ता का बेस क्लास बनाने और विशिष्ट उपयोगकर्ता प्रकारों के लिए एसटीआई का उपयोग करें, उदाहरण के लिए:

class User < ActiveRecord::Base 
end 

class Manufacturer < User 
has_many :products 
has_many :transporters, :through => :products 
end 

... आदि। इस तरह यदि किसी भी प्रकार के संबंध में किसी भी रिश्ते में कई उपयोगकर्ता प्रकारों को एकत्रित करने की आवश्यकता है, तो आपके पास सामान्य रूप से उपयोगकर्ताओं का वर्णन करने के लिए एक तालिका है। यह एक काफी आम दृष्टिकोण है।

इस पर निर्भर करता है कि विभिन्न उपयोगकर्ताओं के पास कितनी पहुंच होगी, आप रोल प्रबंधन मणि को Declarative Authorization जैसे देखना चाहते हैं।

+0

मदद के लिए धन्यवाद! उपयोगकर्ता के आधार वर्ग और विशिष्ट उपयोगकर्ता प्रकारों के लिए एसटीआई के साथ डेटाबेस टेबल कैसे स्थापित किए जाएंगे? मैं वास्तव में, वास्तव में रेल के लिए नया हूं :) – aguynamedloren

+0

आपके पास डीबी में केवल 'उपयोगकर्ता' तालिका होगी। एसटीआई/एकल तालिका विरासत बेस क्लास के उपप्रकारों के बीच अंतर करने के लिए आधार तालिका (इस मामले में 'उपयोगकर्ताओं') में 'प्रकार' फ़ील्ड का उपयोग करती है। आपको इस क्षेत्र को माइग्रेशन में जोड़ना होगा। फिर बेस क्लास के सभी उपप्रकारों के लिए सभी विशेषताओं को उपयोगकर्ता तालिका में रखा जाएगा, भले ही उनमें से कई विशिष्ट उदाहरण/पंक्तियों द्वारा उपयोग नहीं किए जाएंगे। यह एसटीआई पैटर्न का उपयोग कर ट्रेडऑफ है - आपके पास अप्रयुक्त विशेषताओं के लिए कई शून्य फ़ील्ड हो सकते हैं, इस पर निर्भर करता है कि कितने उप-विशिष्ट-विशिष्ट विशेषताएं हैं। –

1

मेरा सुझाव है कि आप एक उपयोगकर्ता मॉडल, पता मॉडल, ContactInfo मॉडल आदि बनाते हैं। आपके पास उपयोगकर्ता मॉडल में उन प्रकार के फ़ील्ड नहीं होना चाहिए। डेटाबेस को सामान्यीकृत करें। User.id. में उन सभी वर्गों में से प्रत्येक में एक एफके है।

आप चाहिए उन्हें अलग रखने, तो लॉगिन सामान्य और यह उसके मालिक (निर्माता, कर्मचारी, आदि)

+0

Weeeelll ... शायद। एक पते तालिका होने के कारण निश्चित रूप से सामान्यीकृत किया जाता है, लेकिन वास्तविक दुनिया में कई बार यह अधिक होता है, और वास्तव में अधिकतर हार्ड-कोर सामान्यीकरण से भी अधिक बार यह स्वीकार नहीं करेगा कि किसी पते की तरह कुछ - जो कि ज्यादातर मामलों में अधिक कुछ नहीं है एक वर्चर फ़ील्ड की तुलना में - अपने ऊपर की ओर से सभी ओवरहेड के साथ अपनी मेज में सामान्यीकृत करने की आवश्यकता नहीं है। क्या आप सचमुच एसक्यूएल हमेशा उपयोगकर्ताओं की क्वेरी के लिए हिट चाहते हैं? इस तरह के एक सरल ऑपरेशन के लिए बहुत प्रदर्शन नहीं है। डोमेन पर बहुत अधिक निर्भर करता है, और क्या पते वास्तव में जटिल और पुन: प्रयोज्य हैं, आदि –

+0

@ डेव सिम्स - मैं पूरी तरह से सम्मानपूर्वक असहमत हूं। आज की दुनिया में, हमें जितना संभव हो उतना जानकारी चाहिए। सामान्यीकरण (विशेष रूप से पते के साथ) भविष्य के विस्तार की अनुमति देता है - हम उपयोगकर्ता को कई पते (उदाहरण के लिए घर और काम) रखने की अनुमति दे सकते हैं। और, क्या चुनें * 10 कॉलम लौटाता है या जॉइन 10 कॉलम देता है, इससे कोई फर्क नहीं पड़ता (जैसे ओवरहेड सचमुच अविश्वसनीय रूप से बड़े डेटासेट के लिए महत्वहीन है)। इसके अलावा, आप हमेशा किसी उपयोगकर्ता के साथ कोई पता नहीं दिखाएंगे, तो आपके पास उपयोगकर्ताओं की तालिका में क्यों होगा? यह एक अलग वस्तु – sethvargo

+0

@ डेव सिम्स - (cont) है। इस बारे में मेरा नज़रिया यूं है। मेरे पास पहला नाम है, मेरे पास आखिरी नाम है। मेरे पास एक पता भी है। मेरे पास कोई पता_लाइन_1 और पता_लाइन_2 नहीं है, ज़िप ..., एक पता है एक address_line_1, 2..zip, आदिमेरे लिए, यह सिर्फ इन चीजों को अलग करने के लिए और अधिक समझ में आता है। क्या आपके पास कोई पता बिना उपयोगकर्ता हो सकता है? क्या आप वास्तव में अपनी साइट पर पहुंच प्रतिबंधित करना चाहते हैं यदि कोई बेघर है? मैं शीर्ष पर हूं, लेकिन मुझे लगता है कि आप देखेंगे कि सामान्यीकरण क्यों महत्वपूर्ण है। – sethvargo

4

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

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