inheritance - एक grails डोमेन उप-वर्ग में विरासत गुणों पर बाधाओं को जोड़ने के लिए कैसे




constraints subclass (3)

यहां मैं क्या करना चाहता हूं:

class A {
  String string
  static constraints = {
    string(maxSize:100)
  }
}

class B extends A {
  static constraints = {
    string(url:true)
  }
}

तो कक्षा ए में कुछ बाधाएं होनी चाहिए और बी को एक ही संपत्ति पर समान प्लस अतिरिक्त बाधाएं होनी चाहिए।

मैं इसे काम करने के लिए नहीं मिला था और मैं कल्पना कर सकता हूं कि यह टेबल-प्रति-पदानुक्रम अवधारणा से संघर्ष करेगा।

तो मैंने कक्षा बी की बाधाओं के साथ एक कमांड ऑब्जेक्ट पेश करके उस समस्या के आसपास काम करने की कोशिश की जिसे कक्षा बी के निर्माता में मान्य किया जा सकता है। ऐसा लगता है कि कमांड ऑब्जेक्ट्स का उपयोग केवल नियंत्रकों के भीतर किया जा सकता है (grails कहता रहता है कि कोई नहीं है। () इसके लिए विधि)।

तो मेरा सवाल यह है कि: Grails बाधाओं का उपयोग करके इसे हल करने का सबसे शानदार तरीका क्या है (सत्यापन को मैन्युअल रूप से पुन: लागू नहीं कर रहा है)? हो सकता है...

  • टेबल-प्रति-सब-क्लास अवधारणा पर स्विचिंग?
  • किसी भी तरह डोमेन वर्ग में कमांड ऑब्जेक्ट काम करना?
  • कोई अन्य तरीका?

संपादित करें: मेरे लिए बाल वर्गों में सभी बाधाओं को परिभाषित करना, माता-पिता वर्ग की बाधाओं को दोहराना या माता-पिता वर्ग में बाधाओं को भी ठीक करना ठीक नहीं होगा। लेकिन समाधान एक ही माता-पिता वर्ग के कई बाल वर्गों (विभिन्न बाधाओं के साथ) के लिए काम करना चाहिए।


असल में मैं नहीं देखता कि यह कैसे किया जा सकता है।

एक बुद्धिमानी के रूप में एक डोमेन वर्ग वास्तव में डेटाबेस तालिका की संरचना को मानचित्र बनाता है। बाधाएं वास्तव में डीबी बाधा उत्पन्न करती हैं। तो आप कई ऑब्जेक्ट्स बनाने की कोशिश कर रहे हैं जो एक ही टेबल पर अलग-अलग बाधा उत्पन्न करेंगे।

मुझे लगता है कि बेहतर दृष्टिकोण एक डोमेन ऑब्जेक्ट बनाना होगा जिसमें बाधाओं का सबसे सरल सबसेट हो और फिर डोमेन पर पारित होने वाली सटीक बाधाओं को ठीक करने के लिए विभिन्न कमांड ऑब्जेक्ट्स का उपयोग करें।

आप सत्यापनकर्ता का भी उपयोग कर सकते हैं: अलग-अलग ऑब्जेक्ट प्रकारों के लिए अलग-अलग बाधाओं को ठीक करने के लिए बाधाओं में (डोमेन में प्रकार के कॉलम की तरह कुछ और विभिन्न प्रकारों के आधार पर अलग-अलग सत्यापन होते हैं)।



जिस तरह से यह 2.x में था:

चूंकि बाधाएं कुछ बाधाओं द्वारा निष्पादित एक बंदरगाह है, मैं इसे बी से कॉल करने की कोशिश करता हूं, जैसे

class B extends A { 
  static constraints = { 
    url(unique: true)
    A.constraints.delegate = delegate  # thanks Artefacto
    A.constraints()
  } 
}






command-objects