কলগুলিতে কেবল চালিত করুন যদি কোনও গুণাবলী রেলগুলিতে পরিবর্তিত হয়


100

আমার অ্যাপটিতে আমার নিম্নলিখিত সংস্থান রয়েছে:

# Page 
belongs_to :status

আমি একটি কলব্যাক যে কোন সময় চালাতে চান status_idএকটি এর pageপরিবর্তন করা হয়েছে।

সুতরাং, যদি page.status_id4 থেকে 5 পর্যন্ত যায় তবে আমি এটি ধরতে সক্ষম হতে চাই।

কীভাবে করবেন?

উত্তর:


209

রেলগুলি 5.1+

class Page < ActiveRecord::Base
  before_save :do_something, if: :will_save_change_to_status_id?

  private

  def do_something
    # ...
  end
end

অ্যাক্টিভেকর্ডকে পরিবর্তন করেছে যে প্রতিশ্রুতি :: নোংরা এখানে: https://github.com/rails/rails/commit/16ae3db5a5c6a08383b974ae6c96faac5b4a3c81

এই পরিবর্তনগুলি সম্পর্কে এখানে একটি ব্লগ পোস্ট রয়েছে: https://www.ombulabs.com/blog/rails/upgrades/active-record-5-1-api-changes.html

অ্যাক্টিভেকর্ড :: আমার 5 টি রেলের জঞ্জাল পরিবর্তনগুলি সম্পর্কে আমি নিজের জন্য সংক্ষিপ্তসারটি এখানে দিয়েছি:

অ্যাক্টিভেকর্ড :: নোংরা

https://api.rubyonrails.org/classes/ActiveRecord/AtributeMethods/Dirty.html

সংরক্ষণের আগে (বিকল্প পরিবর্তন)

কোনও বস্তুটি সংশোধন করার পরে এবং ডাটাবেসে সংরক্ষণ করার আগে বা before_saveফিল্টারের মধ্যে:

  • changes এখন করা উচিত changes_to_save
  • changed? এখন করা উচিত has_changes_to_save?
  • changed এখন করা উচিত changed_attribute_names_to_save
  • <attribute>_change এখন করা উচিত <attribute>_change_to_be_saved
  • <attribute>_changed? এখন করা উচিত will_save_change_to_<attribute>?
  • <attribute>_was এখন করা উচিত <attribute>_in_database

সংরক্ষণের পরে (পরিবর্তন পরিবর্তন করুন)

কোনও বস্তুটি সংশোধন করার পরে এবং ডাটাবেসে সংরক্ষণ করার পরে, বা after_saveফিল্টারের মধ্যে:

  • saved_changes(প্রতিস্থাপন previous_changes)
  • saved_changes?
  • saved_change_to_<attribute>
  • saved_change_to_<attribute>?
  • <attribute>_before_last_save

রেল <= 5.0

class Page < ActiveRecord::Base
  before_save :do_something, if: :status_id_changed?

  private

  def do_something
    # ...
  end
end

এটি কল্যাকব্যাকটি কোনও before_saveশর্ত অনুসারে একটি পদ্ধতির কলের রিটার্ন মানের উপর ভিত্তি করে কার্যকর করতে পারে তা ব্যবহার করে । status_id_changed?পদ্ধতি থেকে আসে ActiveModel :: ডার্টি , যা একটি নির্দিষ্ট বৈশিষ্ট্য কেবল সংযোজন করে পরিবর্তিত হয়েছে যদি আমাদের চেক করতে পারবেন _changed?অ্যাট্রিবিউট নাম।

do_somethingপদ্ধতিটি কখন ডাকা উচিত তা আপনার প্রয়োজনের উপর নির্ভর করে। এটি হতে পারে before_saveবা after_saveকোনও নির্ধারিত অ্যাক্টিভেকর্ড :: কলব্যাকস হতে পারে ।


4
এই সমাধানটি আরও নতুন সংস্করণগুলিতে অবচয় করা হয়েছে।
ম্যাটিউস লুইজ

6
5.3++ রেলের সাথে আপডেট হয়েছে।
পিডবব


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