3 টি বৈশিষ্ট্য পরিবর্তন হয়েছে কিনা তা পরীক্ষা করে দেখুন ails


153

রেল 3 এ আপডেট করার আগে অ্যাট্রিবিউটের কোনও ব্লক পরিবর্তন হয়েছে কিনা তা পরীক্ষা করে দেখার দরকার Need

Street1, Street2, শহর, রাজ্য, পিনকোড

আমি জানি আমি এরকম কিছু ব্যবহার করতে পারি

if @user.street1 != params[:user][:street1]
  then do something....
end

কিন্তু কোডটির টুকরাটি বেশ দীর্ঘ হবে। একটি পরিষ্কার উপায় আছে?

উত্তর:


282

পরীক্ষা করে দেখুন ActiveModel :: ডার্টি (ডিফল্ট অনুসারে সমস্ত মডেলের এ উপলব্ধ)। ডকুমেন্টেশনটি সত্যিই ভাল, তবে এটি আপনাকে এমন কিছু করতে দেয়:

@user.street1_changed? # => true/false

আপনি যদি কোনও বৈশিষ্ট্যে কোনও ফর্মের পরিবর্তন হয়েছে কিনা (এটি ওপি কী করছে বলে মনে হচ্ছে) তা দেখার চেষ্টা করলে এটি সাহায্য করবে না।
মার্ক ফ্রেজার

8
অবশ্যই এটি। আপনি যদি প্যারামগুলি হ্যাশ ব্যবহার করে মানগুলি নির্ধারণ করেন তবে এগুলি ফর্ম থেকে এসেছে।
পিটার ব্রাউন

আমি যদি এর মতো কিছু করতে চাই তবে কী হবে: মডেল। বা এর মতো কিছু
মরো ডায়াস

@ মাউরোডিয়াস যেমন সংগ্রহের বৈশিষ্ট্য ট্র্যাক করতে আপনার নিজের যুক্তি লিখতে হবে
পিটার ব্রাউন

আমি এটির জন্য কিছু পরীক্ষা লিব ব্যবহার করার চেষ্টা করব। যাইহোক, TY
মুরো ডায়াস

54

আমি একাধিক বৈশিষ্ট্যের পরিবর্তনের জন্য এটি পরীক্ষা করার সমস্যাটি সমাধান করেছি।

attrs = ["street1", "street2", "city", "state", "zipcode"]

if (@user.changed & attrs).any?
  then do something....
end

changedপদ্ধতি চারিত্রিক বৈশিষ্ট্য আছে যেগুলো বস্তুর জন্য পরিবর্তন একটি বিন্যাস দেখায়।

উভয়ই @user.changedএবং attrsঅ্যারে তাই আমি ছেদটি পেতে পারি ( ary & other aryপদ্ধতিটি দেখুন)। ছেদ করার ফলাফলটি একটি অ্যারে। any?অ্যারেতে কল করে, যদি অন্তত একটি চৌরাস্তা থাকে তবে আমি সত্য হয়ে উঠি।

এছাড়াও খুব দরকারী, changed_attributesপদ্ধতিটি তাদের মূল মানগুলির সাথে বৈশিষ্ট্যের changesএকটি হ্যাশ প্রদান করে এবং মূল এবং নতুন মানগুলির সাথে একটি অ্যারেগুলিতে বৈশিষ্ট্যের একটি হ্যাশ প্রদান করে।

সংস্করণগুলি এই পদ্ধতিগুলিকে সমর্থন করে যার জন্য আপনি এপিআইডক চেক করতে পারেন।

http://apidock.com/rails/ActiveModel/Dirty


1
এটি করার একটি দুর্দান্ত উপায়। Doneতিহাসিকভাবে আমি এটি করেছি if attrs.any?{|attr| @user.send("#{attr}_changed?")}যখন আমি পরীক্ষা করতে চাই যে বেশ কয়েকটি ভিন্ন বৈশিষ্ট্যের মধ্যে কোনওটির কোনও পরিবর্তন হয়েছে কিনা - অবশ্যই, আমি কেবলমাত্র আমি নিজেকে সংজ্ঞায়িতকারীদের সাথে এটি করি, কারণ আমি কোনও sendপদ্ধতিতে ব্যবহারকারীর প্যারাম নিক্ষেপ করতে পছন্দ করি না । ;)
nzifnab

14

ActiveModel::Dirtyআমার জন্য কাজ হয়নি কারণ @model.update_attributes()পরিবর্তনগুলি লুকিয়ে রেখেছিল। সুতরাং আমি এটি সনাক্তকারী updateএকটি নিয়ামক পদ্ধতিতে এটি পরিবর্তন করে :

def update
  @model = Model.find(params[:id])
  detect_changes

  if @model.update_attributes(params[:model])
    do_stuff if attr_changed?
  end
end

private

def detect_changes
  @changed = []
  @changed << :attr if @model.attr != params[:model][:attr]
end

def attr_changed?
  @changed.include :attr
end

আপনি যদি অনেকগুলি গুণাবলী পরিবর্তনগুলি সনাক্ত করার চেষ্টা করছেন তবে এটি অগোছালো হতে পারে। সম্ভবত একটি নিয়ামক এটি করা উচিত নয়, কিন্তু মেহ।


9
এটির জন্য মূল্যবান, আপনি এটির সাহায্যে এটি previous_changesডিফল্টরূপেও উপলভ্য করতে পারেন ।
জেসন গাল্টেন

2
#update_attributesপরিবর্তনগুলি আড়াল করে না এটি রেকর্ডটি সংরক্ষণ করে, সুতরাং মডেলটি আপডেট হয়েছে এবং কোনও পরিবর্তন নেই। আপনাকে মডেলটিতে ক্ষেত্রটি পরিবর্তন করতে হবে এবং changed?সংরক্ষণ করার আগে আপনাকে এটি পরীক্ষা করতে হবে। অর্থাত। @ model.field = 'foo বিন্যাস' বা@model.attributes = @model.attributes.merge(params[:model])
Grzegorz

9

রেল 5.1+ কলব্যাকের জন্য

5.1 রেল অন রুবি হিসাবে, attribute_changed?এবং attribute_wasঅ্যাক্টিভরেকর্ড পদ্ধতিগুলি হ্রাস করা হবে

saved_change_to_attribute?পরিবর্তে ব্যবহার করুনattribute_changed?

@user.saved_change_to_street1? # => true/false

আরও উদাহরণ এখানে


2

উপরের উত্তরগুলি আরও ভাল তবে জ্ঞানের জন্য আমাদের আরও একটি পন্থা রয়েছে, একটি বস্তুর (@ ডিজাইন) জন্য 'ক্যাটাগরী' কলামের মান পরিবর্তন করা হয়েছে,

@design.changes.has_key?('catagory')

। পরিবর্তনগুলি কলামের নাম হিসাবে কী সহ একটি হ্যাশ এবং প্রতিটি কলামের জন্য দুটি মান [পুরানো_মূল্য, নতুন_মূল্য] সহ একটি মান হিসাবে অ্যারে হিসাবে ফিরে আসবে। উদাহরণস্বরূপ উপরের জন্য ক্যাটাগরিটি 'এবিসি' থেকে @ ডিজাইনের 'এক্সওয়াইজেড' তে পরিবর্তন করা হয়েছে,

@design.changes   # => {} 
@design.catagory = 'XYZ'
@design.changes # => { 'catagory' => ['ABC', 'XYZ'] }

রেফারেন্সের জন্য ROR এ পরিবর্তন করুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.