9

मैं सेटअप निम्नलिखित मॉडल के साथ एक भूमिका आधारित अभिगम नियंत्रण प्रणाली है:क्या मॉडल में सशर्त सहयोग बनाना संभव है?

  • भूमिका (एसटीआई के रूप में),
    • UserRole (वैश्विक भूमिकाओं)
    • ProjectRole (परियोजना विशिष्ट भूमिकाओं)
  • असाइनमेंट (विभिन्न संसाधनों के साथ पॉलिमॉर्फिक)
  • उपयोगकर्ता
  • प्रोजे ect (असाइनमेंट के लिए एक संसाधन प्रकार के रूप में)

उपयोगकर्ताओं को केवल एक प्रोजेक्ट के लिए जिम्मेदार होने की अनुमति है यदि उनके पास एक विशिष्ट उपयोगकर्ता रोल है। यह उपयोगकर्ता नाम "प्रोजेक्ट्स के लिए ज़िम्मेदार" नाम है और आईडी 2 है।

उपयोगकर्ता मॉडल में दो हैं_मेनी एसोसिएशन हैं: जिम्मेदार_एग्निमेंट्स और जिम्मेदार_प्रोजेक्ट्स। यह संगठन केवल तभी वैध हैं जब उपयोगकर्ता के पास आईडी 2 के साथ "परियोजनाओं के लिए ज़िम्मेदार" उपयोगकर्ता है।

क्या जिम्मेदार_ * एसोसिएशन के लिए उपयोगकर्ता मॉडल में सशर्त सहयोग बनाना संभव है और क्या यह इस तरह के सेटअप के लिए एक आम तरीका है संबंधों का?

समस्याओं इस तरह का हल करने के लिए सबसे अच्छा तरीका क्या है?

class Role < ActiveRecord::Base 
    has_many :assignments 
    has_many :users, :through => :assignments 

class UserRole < Role 

class ProjectRole < Role 

class Assignment < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :role 
    belongs_to :resource, :polymorphic => true 

class User < ActiveRecord::Base 
    has_many :assignments 
    has_many :roles, :through => :assignments, 
        :class_name => "UserRole" 
    has_many :responsible_assignments, :class_name => "Assignment", 
            :conditions => { :role_id => 4 }  // specific project role 
    has_many :responsible_projects, :through => :responsible_assignments, 
           :source => :resource, 
           :source_type => 'Project', 
           :conditions => { :status => 1 }   // project is active 
    ... 

class Project < ActiveRecord 
    ... 
+0

आप एक सशर्त सहयोग से क्या मतलब है ? क्या शर्तें हैं? – Yanhao

+0

शर्त यह है: यदि किसी उपयोगकर्ता के पास आईडी 2 के साथ कोई भूमिका नहीं है, तो जिम्मेदार_ * संघ मान्य नहीं हैं/सेट नहीं किए जाने चाहिए। – tonymarschall

उत्तर

7

आप ऐसी स्थितियों को संघों में नहीं डाल सकते हैं। इस तरह की चीजें scopes में संभाला जाता है। अधिक जानकारी के लिए

http://guides.rubyonrails.org/active_record_querying.html#scopes पढ़ें।

अपनी स्थिति के लिए

उदाहरण के लिए,

आप चाहते हैं एक विशेष परियोजना भूमिका

scope :responsible_users, where('users.role_id = 4') 
scope :select_assignment_ids, select('assignments.id') 
scope :responsible_assignments, joins(:assignments).responsible_users.select_assignment_ids 

आप चाहते हैं के साथ सभी कार्य (आईडीएस) एक उपयोगकर्ता के तहत एक विशेष परियोजना के साथ सभी परियोजनाओं (आईडीएस), एक उपयोगकर्ता के तहत भूमिका, जो सक्रिय हैं।

scope :active_projects, where('projects.status = 1') 
scope :select_project_ids, select('projects.id') 
scope :responsible_projects, joins(:assignments => :projects).responsible_users.active_projects.select_project_ids 
1

उन संगठनों को मॉडल लोड करने पर बनाया गया है। आपकी स्थिति उस समय अज्ञात है। आप अवांछित रिकॉर्ड्स को फ़िल्टर करने के लिए केवल एसोसिएशन में स्थितियों को शामिल कर सकते हैं।

20

मामले में किसी को भी बाद में इस पाता है - यह सुविधा अब वास्तव में रेल 4 में उपलब्ध है:

http://guides.rubyonrails.org/association_basics.html

सिंटेक्स है:

has_many :orders, -> { where processed: true } 
संबंधित मुद्दे