2009-08-13 8 views
6

मैं एक खाता मॉडल और एक उपयोगकर्ता मॉडल है। लेकिन मैं कैसे सत्यापित करूं कि खाते में नए उपयोगकर्ताओं को जोड़ने के दौरान यह अधिकतम तक नहीं पहुंचा है?मान्य अधिकतम राशि वायुसेना जुड़ी वस्तुएं

सबसे पहले मैं उपयोगकर्ता पर एक सत्यापन जोड़ने की कोशिश की:

class User < ActiveRecord::Base 
    belongs_to :account 
    validate :validate_max_users_have_not_been_reached 

    def validate_max_users_have_not_been_reached 
    return unless account_id_changed? # nothing to validate 
    errors.add_to_base("can not be added to this account since its user maximum have been reached") unless account.users.count < account.maximum_amount_of_users 
    end 
end

लेकिन यह केवल काम करता है अगर मैं एक समय में एक उपयोगकर्ता को जोड़ने कर रहा हूँ।

मैं @account.update_attributes(:users_attributes => ...) के माध्यम से एक से अधिक उपयोगकर्ता जोड़ देते हैं तो यह सिर्फ भले ही एक और उपयोगकर्ता के लिए केवल कमरा है के माध्यम से सीधे चला जाता है।

अद्यतन:

बस स्पष्ट करने के लिए: वर्तमान सत्यापन विधि मान्य करता है कि account.users.countaccount.maximum_amount_of_users से कम है। तो उदाहरण के लिए कहते हैं कि account.users.count 9 और account.maximum_amount_of_users 10 है, तो प्रमाणीकरण में सफल होगा, क्योंकि 9 < 10.

समस्या यह है कि गिनती account.users.count से लौटे जब तक सभी उपयोगकर्ताओं डेटाबेस के लिए लिखा गया है में वृद्धि नहीं होगी है। यह एक ही समय में एकाधिक उपयोगकर्ताओं को जोड़ना उपयोगकर्ता की संख्या के बाद से सत्यापन पारित करेंगे जब तक के बाद वे सभी मान्य किए जाते हैं वही होगा का मतलब है।

तो रूप askegg अंक बाहर, मैं भी खाता मॉडल के लिए मान्यता जोड़ना चाहिए? और यह कैसे किया जाना चाहिए?

उत्तर

16

यदि आप के बजाय account.users.size पर कॉल करते हैं तो इसमें उन उपयोगकर्ताओं को भी शामिल किया जाएगा जो डेटाबेस में सहेजे गए हैं लेकिन डेटाबेस में सहेजे नहीं गए हैं।

हाउवर यह आपकी समस्या को पूरी तरह से हल नहीं करेगा। जब आप किसी उपयोगकर्ता में account फोन उसी खाते उदाहरण है कि @account तो यह नए उपयोगकर्ताओं के बारे में पता नहीं है की ओर इशारा करते है लौटा रहा है। मेरा मानना ​​है कि यह रेल 3 में "तय" होगा, लेकिन इस बीच मैं कुछ समाधानों के बारे में सोच सकता हूं।

यदि आप खाते को सहेज रहे हैं तो आप उपयोगकर्ताओं को जोड़ रहे हैं (जो मुझे लगता है कि आप update_attributes पर कॉल कर रहे हैं) तो सत्यापन वहां जा सकता है।

# in account.rb 
def validate_max_users_have_not_been_reached 
    errors.add_to_base("You cannot have more than #{maximum_amount_of_users} users on this account.") unless users.size < maximum_amount_of_users 
end 

मुझे यकीन नहीं है कि आप संबंधित मॉडल कैसे सहेज रहे हैं, लेकिन यदि खाता सत्यापन विफल रहता है तो उन्हें सहेजा नहीं जाना चाहिए।

अन्य समाधान जब उपयोगकर्ता विशेषताओं को अद्यतन करने के लिए स्वयं user.account उदाहरण पुनर्स्थापित करने के लिए है। आप इसे user_attributes सेटर विधि में कर सकते हैं।

# in account.rb 
def users_attributes=(attributes) 
    #... 
    user.account = self 
    #... 
end 

इस तरह उपयोगकर्ता के खाते में एक ही खाते उदाहरण की ओर इशारा करेंगे तो account.users.size राशि वापस आ जाएगी। इस मामले में आप उपयोगकर्ता मॉडल में सत्यापन रखेंगे।

यह एक मुश्किल समस्या है लेकिन उम्मीद है कि इसने आपको इसे हल करने के तरीके पर कुछ विचार दिए हैं।

-2

कारण यह गुजर रहा है क्योंकि update_attributes सत्यापन के माध्यम से जाना नहीं है।

इसके अलावा - अपने तर्क केवल अपने अधिकतम अनुमोदित के खिलाफ खाते की मौजूदा संख्या के लिए जाँच करता है। जोड़े जाने का प्रयास करने वाले उपयोगकर्ताओं की संख्या पर विचार करने की कोई गणना नहीं है। मुझे लगता है कि यह तर्क खाता मॉडल (?) में अधिक संबंधित है।

+0

update_attributes मान्यताओं को चलाता है - कम से कम रेल 2.3.2 में। लेकिन समस्या यह है कि उपयोगकर्ता मॉडल पर सत्यापन विधि मान्य करती है कि अधिकतम उपयोगकर्ता खाते से पहले कितने उपयोगकर्ताओं की तुलना में अधिकतम नहीं पहुंचता है। अर्थात। यदि अधिकतम == 10 और उपयोगकर्ता.count == 9, तो - एक ही समय में दो उपयोगकर्ताओं को जोड़ते समय - सत्यापन दोनों ही के लिए चलाए जाते हैं लेकिन प्रत्येक बार 9 <10 को सत्यापित करते हैं। चूंकि उपयोगकर्ता.count इससे पहले नहीं बढ़ेगा उपयोगकर्ता डेटाबेस में लिखे गए हैं। लेकिन खाता मॉडल पर कोई इसे कैसे मान्य करेगा? क्या मुझे update_attributes आदि को ओवरराइड करना चाहिए? –

+1

आह - मुझे क्षमा करें। Update_attribute (अंत में लापता "एस" को नोट करें) सत्यापन को बाईपास करता है। मेरी गलती। ऐसा लगता है कि रयान (जो मुझसे ज्यादा रूबीफू है) ने आपके प्रश्न का उत्तर दिया है। मुझे नहीं पता था कि "आकार" विधि में सहेजे गए रिकॉर्ड शामिल हैं। आप हर रोज कुछ न कुछ सीखते हैं :) – askegg

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