Ruby on Rails 5.2 - ActiveModel::AttributeMethods

मॉड्यूल ActiveModel :: विशेषतामेथोड




ruby

मॉड्यूल ActiveModel :: विशेषतामेथोड

सक्रिय मॉडल विशेषता तरीके

अपनी विधियों में उपसर्गों और प्रत्ययों को जोड़ने का एक तरीका प्रदान करता है और साथ ही ActiveRecord::Base के निर्माण को संभालने के लिए ActiveRecord::Base -जैसे वर्ग के तरीके जैसे table_name

ActiveModel::AttributeMethods को लागू करने की आवश्यकताएं ActiveModel::AttributeMethods निम्नलिखित हैं:

  • include ActiveModel::AttributeMethods अपनी कक्षा include ActiveModel::AttributeMethods

  • इसके प्रत्येक तरीके को आप जोड़ना चाहते हैं, जैसे कि attribute_method_suffix या attribute_method_prefix

  • अन्य विधियों को कॉल define_attribute_methods बाद define_attribute_methods को कॉल करें।

  • आपके द्वारा घोषित विभिन्न जेनेरिक _attribute विधियों को परिभाषित करें।

  • एक attributes पद्धति को परिभाषित करें, जो आपके मॉडल में हैश की के रूप में प्रत्येक विशेषता नाम के साथ एक हैश और हैश मान के रूप में विशेषता मान देता है। Hash कीज को तार होना चाहिए।

एक न्यूनतम कार्यान्वयन हो सकता है:

class Person
  include ActiveModel::AttributeMethods

  attribute_method_affix  prefix: 'reset_', suffix: '_to_default!'
  attribute_method_suffix '_contrived?'
  attribute_method_prefix 'clear_'
  define_attribute_methods :name

  attr_accessor :name

  def attributes
    { 'name' => @name }
  end

  private

  def attribute_contrived?(attr)
    true
  end

  def clear_attribute(attr)
    send("#{attr}=", nil)
  end

  def reset_attribute_to_default!(attr)
    send("#{attr}=", 'Default Name')
  end
end

स्थिरांक

CALL_COMPILABLE_REGEXP
NAME_COMPILABLE_REGEXP

सार्वजनिक प्रवृत्ति के तरीके

विशेषता_मिसिंग (मिलान, * आर्ग्स, और ब्लॉक) शो स्रोत
# File activemodel/lib/active_model/attribute_methods.rb, line 438
def attribute_missing(match, *args, &block)
  __send__(match.target, match.attr_name, *args, &block)
end

method_missing की तरह है, लेकिन विशेषताओं के लिए। जब method_missing कहा जाता है तो हम यह देखने के लिए method_missing हैं कि क्या कोई मिलान विशेषता विधि है। यदि ऐसा है, तो हम attribute_missing भेजने के लिए विशेषता_मिसिंग को बताते हैं। व्यवहार को अनुकूलित करने के लिए इस विधि को ओवरलोड किया जा सकता है।

method_missing (विधि, * args, और ब्लॉक) दिखाएँ स्रोत
# File activemodel/lib/active_model/attribute_methods.rb, line 425
def method_missing(method, *args, &block)
  if respond_to_without_attributes?(method, true)
    super
  else
    match = matched_attribute_method(method.to_s)
    match ? attribute_missing(match, *args, &block) : super
  end
end

ऑब्जेक्ट विशेषताओं तक पहुंच की अनुमति देता है, जो attributes द्वारा लौटाए गए हैश में होते हैं, जैसे कि वे प्रथम श्रेणी के तरीके थे। इसलिए name विशेषता वाला एक Person वर्ग उदाहरण के लिए Person#name और Person#name= का उपयोग कर सकता है और कभी भी सीधे हैश का उपयोग नहीं कर सकता - ActiveRecord::Base#attributes= साथ कई असाइनमेंट्स को छोड़कर ActiveRecord::Base#attributes=

यह संबंधित वस्तुओं को master_id करने के लिए भी संभव है, इसलिए एक master_id विदेशी कुंजी के साथ clients टेबल से संबंधित Client क्लास मास्टर / मास्टर के माध्यम से मास्टर को तत्काल master_id सकता है।

सुपरक्लास विधि कहता है
का जवाब? (विधि, शामिल करें_पार्टी_मेथोड = गलत) स्रोत दिखाएं
# File activemodel/lib/active_model/attribute_methods.rb, line 446
def respond_to?(method, include_private_methods = false)
  if super
    true
  elsif !include_private_methods && super(method, true)
    # If we're here then we haven't found among non-private methods
    # but found among all methods. Which means that the given method is private.
    false
  else
    !matched_attribute_method(method.to_s).nil?
  end
end
सुपरक्लास विधि कहता है
इसके रूप में भी उपनाम: respond_to_without_attributes?
respond_to_without_attributes? (विधि, शामिल करें_पब्लिक_मथोड्स = गलत)

name विशेषता के साथ एक Person उदाहरण person.respond_to?(:name) person.respond_to?(:name=) person.respond_to?(:name) , person.respond_to?(:name=) , और person.respond_to?(:name?) person.respond_to?(:name=) person.respond_to?(:name?) , जो सभी को पूरा करेगा।

इसके लिए उपनाम: respond_to?