मैं एक खाता मॉडल और एक उपयोगकर्ता मॉडल है। लेकिन मैं कैसे सत्यापित करूं कि खाते में नए उपयोगकर्ताओं को जोड़ने के दौरान यह अधिकतम तक नहीं पहुंचा है?मान्य अधिकतम राशि वायुसेना जुड़ी वस्तुएं
सबसे पहले मैं उपयोगकर्ता पर एक सत्यापन जोड़ने की कोशिश की:
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.count
account.maximum_amount_of_users
से कम है। तो उदाहरण के लिए कहते हैं कि account.users.count
9 और account.maximum_amount_of_users
10 है, तो प्रमाणीकरण में सफल होगा, क्योंकि 9 < 10.
समस्या यह है कि गिनती account.users.count
से लौटे जब तक सभी उपयोगकर्ताओं डेटाबेस के लिए लिखा गया है में वृद्धि नहीं होगी है। यह एक ही समय में एकाधिक उपयोगकर्ताओं को जोड़ना उपयोगकर्ता की संख्या के बाद से सत्यापन पारित करेंगे जब तक के बाद वे सभी मान्य किए जाते हैं वही होगा का मतलब है।
तो रूप askegg अंक बाहर, मैं भी खाता मॉडल के लिए मान्यता जोड़ना चाहिए? और यह कैसे किया जाना चाहिए?
update_attributes मान्यताओं को चलाता है - कम से कम रेल 2.3.2 में। लेकिन समस्या यह है कि उपयोगकर्ता मॉडल पर सत्यापन विधि मान्य करती है कि अधिकतम उपयोगकर्ता खाते से पहले कितने उपयोगकर्ताओं की तुलना में अधिकतम नहीं पहुंचता है। अर्थात। यदि अधिकतम == 10 और उपयोगकर्ता.count == 9, तो - एक ही समय में दो उपयोगकर्ताओं को जोड़ते समय - सत्यापन दोनों ही के लिए चलाए जाते हैं लेकिन प्रत्येक बार 9 <10 को सत्यापित करते हैं। चूंकि उपयोगकर्ता.count इससे पहले नहीं बढ़ेगा उपयोगकर्ता डेटाबेस में लिखे गए हैं। लेकिन खाता मॉडल पर कोई इसे कैसे मान्य करेगा? क्या मुझे update_attributes आदि को ओवरराइड करना चाहिए? –
आह - मुझे क्षमा करें। Update_attribute (अंत में लापता "एस" को नोट करें) सत्यापन को बाईपास करता है। मेरी गलती। ऐसा लगता है कि रयान (जो मुझसे ज्यादा रूबीफू है) ने आपके प्रश्न का उत्तर दिया है। मुझे नहीं पता था कि "आकार" विधि में सहेजे गए रिकॉर्ड शामिल हैं। आप हर रोज कुछ न कुछ सीखते हैं :) – askegg