অ্যাক্টিভেকর্ড বৈশিষ্ট্য পদ্ধতিগুলি ওভাররাইড করুন


150

আমি যা বলছি তার একটি উদাহরণ:

class Person < ActiveRecord::Base
  def name=(name)
    super(name.capitalize)
  end
  def name
    super().downcase  # not sure why you'd do this; this is just an example
  end
end

এটি কাজ করে বলে মনে হচ্ছে, তবে আমি কেবল অ্যাক্টিভেকর্ড :: বেস ডক্সে ওভাররাইড বৈশিষ্ট্য পদ্ধতিতে বিভাগটি পড়েছি এবং এটি read_attributeএবং write_attributeপদ্ধতিগুলি ব্যবহার করার পরামর্শ দেয় । আমি ভেবেছিলাম উপরের উদাহরণে আমি যা করছি তাতে অবশ্যই কিছু ভুল আছে; অন্যথায়, তারা এই পদ্ধতিগুলিকে অ্যাট্রিবিউট পদ্ধতিগুলিকে ওভাররাইড করার জন্য "সঠিক উপায়" হিসাবে আশীর্বাদ করবেন কেন? তারা আরও কুশ্রী প্রতিভা জোর করছে, সুতরাং অবশ্যই একটি ভাল কারণ থাকতে হবে ...

আমার আসল প্রশ্ন: এই উদাহরণটিতে কিছু ভুল আছে?

উত্তর:


211

গ্যারেথের মন্তব্য প্রতিধ্বনিত হচ্ছে ... আপনার কোড লিখিতভাবে কাজ করবে না। এটি এইভাবে আবার লিখতে হবে:

def name=(name)
  write_attribute(:name, name.capitalize)
end

def name
  read_attribute(:name).downcase  # No test for nil?
end

ঠিক আমার যা প্রয়োজন ছিল। ধন্যবাদ হারুন
শে

18
এটি আর সত্য নয়। হয় সুপার বা এটি এখন কাজ করে। আমি তবে হ্যাশ স্বরলিপি পরীক্ষা করিনি।
হার্টপঙ্ক

2
রেল In-তে, হারুনের দ্বারা নির্দিষ্ট করা পাঠক পদ্ধতিটি কাজ করে তবে মূল পোস্টারটি নির্দিষ্ট করে (সুপারকে নাম খাওয়ানো) ভাল কাজ করে এবং হারুনের পরামর্শ অনুযায়ী আইএমএইচও নিজেই গুণটি লেখার চেয়ে পরিষ্কার হয়।
Batkins

1
আমি নীচে মিপাডি দ্বারা প্রদত্ত হ্যাশ পদ্ধতিটি পরীক্ষা করেছি এবং এটি একটি কবজ (রেলস বনাম 3.2.6) এর মতো কাজ করে
আলমাথি

এটি কি সঠিক উত্তর নয়? ধন্যবাদ অ্যারন, আমার পক্ষেও কাজ করেছেন।
সাদিকশা গৌতম

94

অ্যারন লংওয়েলের উত্তরের সম্প্রসারণ হিসাবে, আপনি যে বৈশিষ্ট্যগুলিতে ওভাররাইড হওয়া অ্যাকসেসর এবং মিউটরদের অ্যাক্সেস করতে পারেন সেগুলি ব্যবহার করতে আপনি একটি "হ্যাশ নোটেশন" ব্যবহার করতে পারেন:

def name=(name)
  self[:name] = name.capitalize
end

def name
  self[:name].downcase
end

হ্যাশ সংকেতটি কার্যকর হতে পারে তবে self.attribute3.2.16-এ স্ট্যাকটি ফুঁকবে।
jrhorn424

এটি ||=ডিফল্ট হওয়ার পক্ষে সমর্থন করে :def name; self[:name] ||= 'anon'; end
পল কেন্ট্রেল

আমার জন্য, এই হ্যাশ স্বরলিপিটি কাজ করে। তবে কেন এটি কাজ করে তা আমি জানি না। কেউ কি ব্যাখ্যা করতে পারেন?
রেডিয়ান্টশা

7

এই বিষয়টিতে http://errtheblog.com/posts/18-accessor-missing এ কিছু দুর্দান্ত তথ্য উপলব্ধ রয়েছে ।

এর দীর্ঘ এবং সংক্ষিপ্তটি হ'ল অ্যাক্টিভেকর্ডটি অ্যাক্টিভেকর্ড অ্যাট্রিবিউট অ্যাকসেসরের জন্য সুপার কলগুলি সঠিকভাবে পরিচালনা করে।


-1

আমার কাছে একটি রেল প্লাগইন রয়েছে যা আপনার প্রত্যাশা অনুযায়ী সুপারের সাথে অ্যাট্রিবিউট ওভাররাইডিং কাজ করে। আপনি এটি গিথুবে খুঁজে পেতে পারেন ।

স্থাপন করা:

./script/plugin install git://github.com/chriseppstein/has_overrides.git

ব্যবহার করা:

class Post < ActiveRecord::Base

  has_overrides

  module Overrides
    # put your getter and setter overrides in this module.
    def title=(t)
      super(t.titleize)
    end
  end
end

একবার আপনি কেবল সেই জিনিসগুলি কাজ করার পরে:

$ ./script/console 
Loading development environment (Rails 2.3.2)
>> post = Post.new(:title => "a simple title")
=> #<Post id: nil, title: "A Simple Title", body: nil, created_at: nil, updated_at: nil>
>> post.title = "another simple title"
=> "another simple title"
>> post.title
=> "Another Simple Title"
>> post.update_attributes(:title => "updated title")
=> true
>> post.title
=> "Updated Title"
>> post.update_attribute(:title, "singly updated title")
=> true
>> post.title
=> "Singly Updated Title"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.