ruby on rails - রুবিতে রুবিতে একটি সেটার পদ্ধতির উপর ওভাররাইড করার সঠিক উপায় কী?




ruby-on-rails ruby-on-rails-3 (4)

আমি Rails 3.2.2 তে রুবি ব্যবহার করছি এবং আমি জানতে চাই যে নিম্নোক্ত একটি "সঠিক" / "সঠিক" / "নিশ্চিত" উপায় আমার ক্লাসের বৈশিষ্ট্যগুলির জন্য একটি সেট্টার পদ্ধতিকে ওভাররাইড করার উপায় কিনা।

attr_accessible :attribute_name

def attribute_name=(value)
  ... # Some custom operation.

  self[:attribute_name] = value
end

উপরের কোড প্রত্যাশিত হিসাবে কাজ বলে মনে হয়। যাইহোক, আমি জানতে চাই যে, উপরের কোডটি ব্যবহার করে, ভবিষ্যতে আমার সমস্যা হবে অথবা, অন্তত, আমি রেলগুলিতে রুবিয়ের কোন সমস্যা "আমি আশা করতে পারি" / "ঘটতে পারে" । যদি সেটটার পদ্ধতিটি ওভাররাইড করার সঠিক উপায় না হয়, তাহলে সঠিক উপায় কী?

নোট : আমি কোড ব্যবহার করি

attr_accessible :attribute_name

def attribute_name=(value)
  ... # Some custom operation.

  self.attribute_name = value
end

আমি নিম্নলিখিত ত্রুটি পেতে:

SystemStackError (stack level too deep):
  actionpack (3.2.2) lib/action_dispatch/middleware/reloader.rb:70

আমি দেখেছি যে (অন্তত ActiveRecord সম্পর্ক সংগ্রহের জন্য) নিম্নলিখিত প্যাটার্ন কাজ করে:

has_many :specialties

def specialty_ids=(values)
  super values.uniq.first(3)
end

(এই অ্যারে পাস প্রথম 3 নন-ডুপ্লিকেট এন্ট্রি grabs।)


attr_writer overwrite attr_writer ব্যবহার করে: attribute_name

  def attribute_name=(value)
    # manipulate value
    # then send result to the default setter
    super(result)
  end

================================================== ======================== আপডেট: জুলাই 19, 2017

এখন Rails ডকুমেন্টেশন super ভালো ব্যবহার করার পরামর্শ দিচ্ছে:

class Model < ActiveRecord::Base

  def attribute_name=(value)
    # custom actions
    ###
    super(value)
  end

end

================================================== =========================

মূল উত্তর

মডেলগুলির মাধ্যমে অ্যাক্সেস করার সময় আপনি টেবিলের কলামগুলির জন্য সেট্টার পদ্ধতিগুলি ওভাররাইড করতে চান তবে এটি করার উপায়।

class Model < ActiveRecord::Base
  attr_accessible :attribute_name

  def attribute_name=(value)
    # custom actions
    ###
    write_attribute(:attribute_name, value)
    # this is same as self[:attribute_name] = value
  end

end

Rails ডকুমেন্টেশন মধ্যে ডিফল্ট অ্যাক্সেসারস overriding দেখুন।

তাই, আপনার প্রথম পদ্ধতি হল রেলগুলির মডেলগুলি রুবিতে কলাম সংযোজনগুলির উপরে ওভাররাইড করার সঠিক উপায়। মডেলের বৈশিষ্ট্য হিসাবে টেবিলের কলাম অ্যাক্সেস করতে এই অ্যাক্সেসারগুলি ইতিমধ্যে রেল দ্বারা সরবরাহ করা হয়েছে। এই আমরা ActiveRecord ORM ম্যাপিং কল।

এছাড়াও মনে রাখবেন যে মডেলের শীর্ষে attr_accessible সাথে কিছু করার নেই। এটি একটি সম্পূর্ণ ভিন্ন কার্যকারিতা আছে ( এই প্রশ্ন দেখুন )

কিন্তু রুবিতে, যদি আপনি একটি শ্রেণির জন্য অ্যাক্সেসার সংজ্ঞায়িত করেছেন এবং সেটটারকে ওভাররাইড করতে চান তবে আপনাকে উদাহরণের মতো পরিবর্তনশীল ব্যবহার করতে হবে:

class Person
  attr_accessor :name
end

class NewPerson < Person
  def name=(value)
    # do something
    @name = value
  end
end

একবার আপনি কি জানেন যে এটি attr_accessor কী করে তা বুঝতে সহজ হবে। কোড attr_accessor :name এই দুটি পদ্ধতির সমতুল্য ( attr_accessor :name )

def name # getter
  @name
end

def name=(value) #  setter
  @name = value
end

এছাড়াও আপনার দ্বিতীয় পদ্ধতি ব্যর্থ হয় কারণ এটি একটি অসীম লুপ সৃষ্টি করবে কারণ আপনি একই পদ্ধতিতে attribute_name= একই পদ্ধতিতে কল করছেন।


রেলে 4

আপনি আপনার টেবিলে বয়স বৈশিষ্ট্য আছে বলুন

def age=(dob)   
    now = Time.now.utc.to_date
    age = now.year - dob.year - ((now.month > dob.month || (now.month == dob.month && now.day >= dob.day)) ? 0 : 1)
    super(age) #must add this otherwise you need to add this thing and place the value which you want to save. 
  end

দ্রষ্টব্য: রেলে নতুন comers 4 জন্য আপনাকে modelattr_accessible উল্লেখ করার প্রয়োজন নেই। পরিবর্তে আপনাকে পারমিট পদ্ধতি ব্যবহার করে নিয়ামক পর্যায়ে আপনার গুণাবলী সাদা তালিকাভুক্ত করতে হবে।







setter