অ্যাক্টিভেকর্ড মডেলটিতে আমি কীভাবে একটি গেটর পদ্ধতি ওভাররাইট করতে পারি?


101

আমি একটি অ্যাক্টিভেকর্ড মডেলের জন্য একটি গেটর পদ্ধতি ওভাররাইট করার চেষ্টা করছি। আমার কাছে nameমডেলটিতে একটি বৈশিষ্ট্য বলা হয়েছে Categoryএবং আমি এর মতো কিছু করতে সক্ষম হতে চাই:

def name
  name_trans || name
end

তাহলে name_transঅ্যাট্রিবিউট শূন্য না হয়, তাহলে তা ফেরত অন্য আগমন nameঅ্যাট্রিবিউট। আমি এই কিভাবে করব?

এটি তখন সাধারণত এইভাবে বলা উচিত:

@category.name

উত্তর:


129

পাগল স্টাইল গাইড ব্যবহার বিশেষ পরামর্শ দেওয়া হচ্ছে self[:attr]বেশি read_attribute(:attr)

আপনি এটি এর মতো ব্যবহার করতে পারেন:

def name
  name_trans || self[:name]
end

কেন এটা ভাল? এখানে অন্য কোনও সাইটের সাথে লিঙ্ক করবেন না, এখানে প্রাসঙ্গিক বিটগুলি অন্তর্ভুক্ত করুন। লিঙ্কগুলি অবৈধ হতে পারে
জেমসটি

4
আরও কিছু প্রসঙ্গে এখানে দেখুন: github.com/bbatsov/rails-style-guide/issues/155
মিমসুগরা

99

আপডেট: রেল স্টাইল গাইড অনুযায়ী পছন্দসই পদ্ধতিটি এর self[:name]পরিবর্তে read_attributeএবং ব্যবহার করা write_attribute। আমি আমার উত্তর এড়িয়ে যেতে এবং এর পরিবর্তে পছন্দ করতে উত্সাহিত হবে এই এক


আপনি ঠিক এটির মতো এটি করতে পারেন, কেবলমাত্র read_attributeনামের অ্যাট্রিবিটির মান আনতে এবং nameপদ্ধতিতে পুনরাবৃত্ত কলটি এড়াতে আপনাকে ব্যবহার করতে হবে :

def name 
  name_trans || read_attribute(:name)
end

4
কোনও ধারণা কেন রুবোকপ self[:name]বেশি পছন্দ করে read_attribute[:name]?
জ্যাক Xu

19

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

def name
  name_trans || super
end

এটি কেবল অ্যাট্রিবিউটস গেটর পদ্ধতিতেই কাজ করে না, তবে সমিতিগুলির গিটার পদ্ধতিগুলিও。 খুব。



5

গেটরকে ওভাররাইড করা এবং ব্যবহার করা read_attributeসমিতিগুলির পক্ষে কাজ করে না তবে আপনি alias_method_chainপরিবর্তে ব্যবহার করতে পারেন ।

def name_with_override
  name_trans || name_without_override
end

alias_method_chain :name, :override

আপনি একটি সঠিক উদাহরণ দিতে পারেন ...?
অরূপ রক্ষিত

আমরা হব. আমি শুধু ডকো দেখেছি । এখন যদি আমি nameমডেল অবজেক্টে কল করি তবে কোনটিকে ডাকা হবে - name_with_overrideবা name_without_override?
অরূপ রক্ষিত

4
nameএখন ফোন করবে name_with_override। আপনি যদি কোনও কারণে আসল পদ্ধতিটিতে কল করতে চান তবে কল করতে পারেন name_without_override
প্যাট্রিক অসিটি

ওআই দেখুন .. আপনার জবাবের জন্য ধন্যবাদ //
অরূপ রক্ষিত

2

আপনি যদি এই জাতীয় স্টোর অ্যাট্রিবিউট ব্যবহার করেন

store :settings, accessors: [:volume_adjustment] 

বা রত্ন লিঙ্কের মতো রত্ন ব্যবহার করে hstore_accessor

সুতরাং আপনি storeমডেলটিতে পদ্ধতিটি ব্যবহার করে শেষ করেছেন , তারপরে আপনি যে পদ্ধতিটি ব্যবহার করতে পারবেন না সেটিকে ওভাররাইড self.read_attributeকরতে হবে, তার পরিবর্তে আপনার অবশ্যই এটি ব্যবহার করতে হবে super:

def partner_percentage
  super.to_i || 10
end

0

যদি কেউ name_transগেটর পদ্ধতিতে মানটি আপডেট করতে চায় তবে আপনি স্ব [: নাম] = ব্যবহার করতে পারেন।

def name
  self[:name] = name_trans || self[:name]
  # don't do this, it will cause endless loop
  # update(name: name_trans)
end

0

আপনি রেলগুলি পঠন_প্রেম পদ্ধতি ব্যবহার করতে পারেন। রেল ডক্স


যদিও এই লিঙ্কটি প্রশ্নের উত্তর দিতে পারে, কেবলমাত্র লিঙ্কটি উত্তরগুলিতে এসও তে অনুমোদিত নয়, দয়া করে সেই লিঙ্কটির পিছনে কী থেকে আপনার উত্তরে কিছু প্রসঙ্গ যুক্ত করুন। ধন্যবাদ! :)
এজেটি 82
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.