ब्रायन हेल्मकैम्प के उत्कृष्ट ब्लॉग पोस्ट में "7 Patterns to Refactor Fat ActiveRecord Models" कहा जाता है, वह Form Objects
का उपयोग करके बहु-परत रूपों को दूर करने और accepts_nested_attributes_for
का उपयोग करना बंद कर देता है।, मैं विशिष्टता की जांच कैसे करूं?
संपादित करें: समाधान के लिए below देखें।
मैं लगभग ठीक उसके कोड नमूना दोहराया गया है, जैसा कि मैंने हल करने के लिए एक ही समस्या थी:
class Signup
include Virtus
extend ActiveModel::Naming
include ActiveModel::Conversion
include ActiveModel::Validations
attr_reader :user
attr_reader :account
attribute :name, String
attribute :account_name, String
attribute :email, String
validates :email, presence: true
validates :account_name,
uniqueness: { case_sensitive: false },
length: 3..40,
format: { with: /^([a-z0-9\-]+)$/i }
# Forms are never themselves persisted
def persisted?
false
end
def save
if valid?
persist!
true
else
false
end
end
private
def persist!
@account = Account.create!(name: account_name)
@user = @account.users.create!(name: name, email: email)
end
end
बातें कोड के अपने टुकड़ा में अलग से एक है कि मैं मान्य करने के लिए की जरूरत है खाता नाम (और उपयोगकर्ता ई-मेल) की विशिष्टता। हालांकि, ActiveModel::Validations
में uniqueness
सत्यापनकर्ता नहीं है, क्योंकि यह ActiveRecord
का एक गैर-डेटाबेस समर्थित संस्करण माना जाता है।
मैं लगा तीन तरीकों इस संभाल करने के लिए कर रहे हैं:
- अपने ही विधि लिखें इस (बेमानी लगता है)
- ActiveRecord :: सत्यापन :: UniquenessValidator शामिल जाँच करने के लिए (यह कोशिश की, नहीं मिला यह काम करने के लिए)
- या डेटा भंडारण परत
मैं पिछले एक का उपयोग करना चाहते में बाधा जोड़ें। लेकिन फिर मैं सोच रहा हूं कि कैसे मैं इसे लागू करूंगा। लेकिन सबसे पहले मैं valid?
का उपयोग करें और फिर मैं का उपयोग
def persist!
@account = Account.create!(name: account_name)
@user = @account.users.create!(name: name, email: email)
rescue ActiveRecord::RecordNotUnique
errors.add(:name, "not unique")
false
end
अब मैं दो चेकों मेरी कक्षा में चल रहा है,:
मैं की तरह कुछ कर सकते हैं (metaprogramming, मैं कुछ अन्य क्षेत्रों को संशोधित करने की आवश्यकता होगी) डेटा स्टोरेज बाधाओं के लिए rescue
कथन।
क्या कोई इस मुद्दे को संभालने के लिए एक अच्छा तरीका जानता है? इसके लिए शायद अपने स्वयं के सत्यापनकर्ता को लिखना बेहतर होगा (लेकिन फिर मेरे पास डेटाबेस में दो प्रश्न होंगे, जहां आदर्श रूप से पर्याप्त होगा)।
इस किसी को भी मदद कर सकते हैं: एक ऐसी ही स्थिति में मैं "ActiveModel :: सत्यापन" के बदले "ActiveRecord :: सत्यापन" में शामिल हैं - इस तरह से * validates_uniqueness_of * है में उपलब्ध – Mat