৮.০ এর জন্য পর্যবেক্ষণকারীদের বিকল্পগুলি


153

পর্যবেক্ষকদের সাথে R.০ টি রেল থেকে সরানো হয়েছে , আমি আগ্রহী যে অন্যান্য বিকাশকারীরা তাদের জায়গায় কী ব্যবহার করছে। (আহত রত্নটি ব্যবহার করা ব্যতীত)) পর্যবেক্ষকরা অবশ্যই আপত্তিজনকভাবে ব্যবহার করা হয়েছিল এবং অনেক সময় অনায়াসেই সহজেই পরিণত হতে পারত, কেবল ক্যাশে-ক্লিয়ারিংয়ের বাইরে অনেকগুলি ব্যবহারের ঘটনা ছিল যেখানে তারা উপকারী।

উদাহরণস্বরূপ, এমন একটি অ্যাপ্লিকেশন নিন যা মডেলটির পরিবর্তনগুলি ট্র্যাক করতে পারে। একজন পর্যবেক্ষক সহজেই মডেল এ-র পরিবর্তনের জন্য নজর রাখতে পারেন এবং সেই পরিবর্তনগুলি মডেল বি দিয়ে ডাটাবেসে রেকর্ড করতে পারেন। আপনি যদি বেশ কয়েকটি মডেল জুড়ে পরিবর্তনগুলি দেখতে চান, তবে কোনও একক পর্যবেক্ষক এটি পরিচালনা করতে পারেন।

4 রেলগুলিতে, আমি আগ্রহী যে অন্যান্য বিকাশকারীরা সেই কার্যকারিতাটি পুনরায় তৈরি করতে পর্যবেক্ষকদের জায়গায় কী কৌশল ব্যবহার করছে।

ব্যক্তিগতভাবে, আমি এক ধরণের "ফ্যাট কন্ট্রোলার" বাস্তবায়নের দিকে ঝুঁকছি, যেখানে প্রতিটি মডেল নিয়ন্ত্রকের তৈরি / আপডেট / মোছার পদ্ধতিতে এই পরিবর্তনগুলি ট্র্যাক করা হয়। যদিও এটি প্রতিটি নিয়ামকের আচরণকে সামান্যভাবে স্ফীত করে, সমস্ত কোড এক জায়গায় তাই এটি পঠনযোগ্যতা এবং বোঝার ক্ষেত্রে সহায়তা করে। ক্ষতিটি হ'ল এখন এমন কোড রয়েছে যা বেশ কয়েকটি নিয়ামক জুড়ে খুব অনুরূপ ছড়িয়ে ছিটিয়ে থাকে। সহায়ক কোডগুলিতে সেই কোডটি বের করা একটি বিকল্প, তবে আপনি এখনও সর্বত্র ছড়িয়ে থাকা সেই পদ্ধতিগুলিতে কলগুলি রেখে এসেছেন। বিশ্বের শেষ নয়, তবে "চর্মসার নিয়ন্ত্রক" এর চেতনায়ও যথেষ্ট নয়।

অ্যাক্টিভেকর্ড কলব্যাক্স হ'ল আরেকটি সম্ভাব্য বিকল্প, যদিও এটি ব্যক্তিগতভাবে আমি পছন্দ করি না কারণ এটি দুটি ভিন্ন মডেলকে আমার মতে খুব ঘনিষ্ঠভাবে একত্রে প্রবণ করে।

সুতরাং রেলস 4-এ, নো-পর্যবেক্ষক বিশ্বের, অন্য রেকর্ড তৈরি / আপডেট / ধ্বংস হওয়ার পরে যদি আপনাকে একটি নতুন রেকর্ড তৈরি করতে হয়, আপনি কোন ডিজাইনের প্যাটার্নটি ব্যবহার করবেন? ফ্যাট কন্ট্রোলার, অ্যাক্টিভেকর্ড কলব্যাকস, বা পুরোপুরি অন্য কিছু?

ধন্যবাদ.


4
আমি সত্যিই অবাক হয়েছি যে এই প্রশ্নের জন্য আরও উত্তর পোস্ট করা হয়নি। উদ্বিগ্ন ধরনের।
আদালতসমাজ

উত্তর:


82

কনসার্নস একবার দেখুন

উদ্বেগ নামক আপনার মডেল ডিরেক্টরিতে একটি ফোল্ডার তৈরি করুন। সেখানে একটি মডিউল যুক্ত করুন:

module MyConcernModule
  extend ActiveSupport::Concern

  included do
    after_save :do_something
  end

  def do_something
     ...
  end
end

পরবর্তী, আপনি যে মডেলগুলিতে after_save চালাতে চান তাতে অন্তর্ভুক্ত করুন:

class MyModel < ActiveRecord::Base
  include MyConcernModule
end

আপনি যা করছেন তার উপর নির্ভর করে এটি আপনাকে পর্যবেক্ষক ছাড়াই কাছাকাছি পেতে পারে।


20
এই পদ্ধতির সাথে সমস্যা রয়েছে। উল্লেখযোগ্যভাবে, এটি আপনার মডেলগুলি পরিষ্কার করে না; মডিউলটি থেকে পদ্ধতিগুলি আপনার ক্লাসে ফিরে আসুন include মডিউলে ক্লাসের পদ্ধতিগুলি বের করা তাদের উদ্বেগের সাথে গ্রুপ করতে পারে তবে ক্লাসটি এখনও ঠিক তেমন ফুলে গেছে।
স্টিভেন সোরোকা

15
শিরোনামটি হ'ল 'রেলস অবজার্ভার অল্টারনেটিভস অফ 4.0.০' না 'আমি কীভাবে ব্লাটকে ছোট করব'। উদ্বেগগুলি স্টিভেন কাজটি করে না এমনটা কীভাবে? এবং না, সুপারিশ করা যে 'ব্লাট' পর্যবেক্ষকদের জন্য প্রতিস্থাপন হিসাবে এটি কাজ করবে না এটি যথেষ্ট ভাল নয়। সম্প্রদায়কে সহায়তা করার জন্য আপনাকে আরও ভাল পরামর্শ নিয়ে আসতে হবে বা পর্যবেক্ষকদের প্রতিস্থাপন হিসাবে উদ্বেগ কেন কাজ করবে না তা ব্যাখ্যা করতে হবে। আশাকরি আপনি উভয়ই ডি = ডি
আঙ্কেলআডাম

10
ফোটা সবসময় উদ্বেগের বিষয়। আরও ভাল বিকল্প বুদ্ধিমান , যা সঠিকভাবে প্রয়োগ করা হলে, উদ্বেগগুলি মডেলগুলির সাথে শক্তভাবে মিলিত নয় এমন পৃথক ক্লাসে বের করে আপনাকে উদ্বেগগুলি পরিষ্কার করতে দেয়। এটি বিচ্ছিন্নতাতে পরীক্ষা করাও অনেক সহজ করে তোলে
স্টিভেন সোরোকা

4
এটি করার জন্য কোনও রত্নকে টেনে মডেল ফোলা বা পুরো অ্যাপ্লিকেশন ফোলাতে - আমরা এটি ব্যক্তিগত পছন্দতে রেখে দিতে পারি। অতিরিক্ত পরামর্শের জন্য ধন্যবাদ।
আঙ্কেলএডাম

এটি কেবল আইডিইর পদ্ধতিটি অটো-সম্পূর্ণ মেনুটি ফুটিয়ে তুলবে, যা অনেক লোকের পক্ষে ঠিক হওয়া উচিত।
লুলালালা

33

তারা এখন একটি প্লাগইনে আছে।

আমি কি এমন কোনও বিকল্প প্রস্তাব করতে পারি যা আপনাকে নিয়ন্ত্রকগুলি যেমন দেয়:

class PostsController < ApplicationController
  def create
    @post = Post.new(params[:post])

    @post.subscribe(PusherListener.new)
    @post.subscribe(ActivityListener.new)
    @post.subscribe(StatisticsListener.new)

    @post.on(:create_post_successful) { |post| redirect_to post }
    @post.on(:create_post_failed)     { |post| render :action => :new }

    @post.create
  end
end

অ্যাক্টিভসপোর্ট :: বিজ্ঞপ্তিগুলি সম্পর্কে কীভাবে?
সাফল্য

@ সাভোপটি ActiveSupport::Notificationsজেনেরিক সাব / পাব নয়, উপকরণের দিকে এগিয়ে রয়েছে।
ক্রিস

@ ক্রিস - আপনি ঠিক বলেছেন এটি প্রাথমিকভাবে উপকরণের জন্য ব্যবহৃত হয়, তবে আমি অবাক হই যে এটি কী পাব / সাব এর জেনেরিক পদ্ধতি হিসাবে ব্যবহার করা থেকে বাধা দেয়? এটি বেসিক বিল্ডিং ব্লকগুলি সরবরাহ করে, তাই না? অন্য কথায়, বুদ্ধিমানের তুলনায় আপ / ডাউনসাইডগুলি কী কী ActiveSupport::Notifications?
জিঞ্জারাইম

আমি Notificationsখুব বেশি ব্যবহার করি নি তবে আমি বলতে পারি Wisperএকটি ভাল এপিআই রয়েছে এবং 'গ্লোবাল সাবস্ক্রাইবার', 'উপসরে' এবং 'ইভেন্ট ম্যাপিং' এর মতো বৈশিষ্ট্য রয়েছে Notifications। ভবিষ্যতের প্রকাশের ফলে Wisperসাইডকিক / রেসকিউ / সেলুলয়েডের মাধ্যমে অ্যাসিঙ্ক প্রকাশের অনুমতি দেবে। এছাড়াও, সম্ভাব্যরূপে, ভবিষ্যতে রেলের রিলিজগুলিতে, এপিআই Notificationsপরিবর্তন করতে পারে আরও উপকরণ ফোকাস করার জন্য।
ক্রিস

21

আমার পরামর্শ হ'ল জেমস গলিকের ব্লগ পোস্টটি http://jamesgolick.com/2010/3/14/crazy-hereical-and-awesome-the-way-i-write-rails-apps.html এ পড়ুন (কীভাবে উপেক্ষা করার চেষ্টা করবেন শিরোনাম শোনার শব্দ)।

আগের দিন এটি ছিল সমস্ত "ফ্যাট মডেল, চর্মসার নিয়ামক"। তারপরে চর্বিযুক্ত মডেলগুলি বিশেষত পরীক্ষার সময় একটি দৈত্য মাথাব্যথা হয়ে ওঠে। সাম্প্রতিককালে এই চাপটি চর্মসার মডেলগুলির হয়ে উঠেছে - এই ধারণাটি হ'ল যে প্রতিটি শ্রেণীর একটি করে দায়িত্ব পালন করা উচিত এবং একটি মডেলের কাজ হ'ল ডেটাবেসে আপনার ডেটা বজায় রাখা। তাহলে আমার সমস্ত জটিল ব্যবসায়ের যুক্তি শেষ কোথায়? ব্যবসায়িক লজিক ক্লাসে - ক্লাস যা লেনদেনের প্রতিনিধিত্ব করে।

এই যুক্তিটি যখন যুক্তি জটিল হতে শুরু করে তখন একটি চৌম্বকিতে পরিণত হতে পারে ity ধারণাটি যদিও দুর্দান্ত - কলব্যাক বা পর্যবেক্ষকগুলির সাথে পরীক্ষা বা ডিবাগ করা কঠিন এমন বিষয়গুলি স্পষ্টভাবে ট্রিগার করার পরিবর্তে আপনার ক্লাসে স্পষ্টভাবে ট্রিগার করা জিনিসগুলি আপনার মডেলের উপরে লজিককে স্তরযুক্ত করে।


4
আমি গত কয়েক মাস ধরে একটি প্রকল্পের জন্য এরকম কিছু করছি। আপনি প্রচুর অল্প পরিষেবা দিয়ে শেষ করেছেন, তবে এটির পরীক্ষা চালিয়ে যাওয়া ও বজায় রাখার স্বাচ্ছন্দতা অবশ্যই অসুবিধাগুলি ছাড়িয়ে যায়। এই মাঝারি আকারের সিস্টেমে আমার মোটামুটি প্রশস্ত চশমা চালাতে এখনও কেবল 5 সেকেন্ড সময় লাগবে :)
লুকা স্পিলার

পোরো (সমতল পুরাতন রুবি অবজেক্টস), বা পরিষেবা
সামগ্রীর

13

সক্রিয় রেকর্ড কলব্যাকগুলি সহজেই আপনার মিলনের নির্ভরতা ফ্লিপ করে। উদাহরণস্বরূপ, যদি আপনার কাছে modelAএবং CacheObserverপর্যবেক্ষণকারী modelAরেলগুলি 3 স্টাইল থাকে তবে আপনি CacheObserverকোনও সমস্যা ছাড়াই মুছে ফেলতে পারেন । এখন, পরিবর্তে বলুন সংরক্ষণের পরে Aম্যানুয়ালি প্রার্থনা CacheObserverকরতে হবে, যা রেল হবে You. আপনি কেবল নিজের নির্ভরতা সরিয়ে রেখেছেন যাতে আপনি নিরাপদে অপসারণ করতে পারেন Aতবে না CacheObserver

এখন, আমার আইভরি টাওয়ার থেকে আমি পর্যবেক্ষককে যে মডেলটি পর্যবেক্ষণ করছি তার উপর নির্ভর করতে পছন্দ করি। আমি কি আমার নিয়ন্ত্রণকারীদের বিশৃঙ্খলা করার জন্য যথেষ্ট যত্ন নিই? আমার জন্য, উত্তর না হয়।

সম্ভবত আপনি কেন পর্যবেক্ষকের প্রয়োজন / প্রয়োজন তা নিয়ে আপনি কিছুটা চিন্তাভাবনা রেখেছেন এবং সুতরাং এটির পর্যবেক্ষকের উপর নির্ভর করে একটি মডেল তৈরি করা কোনও ভয়াবহ ট্র্যাজেডি নয়।

যে কোনও ধরণের পর্যবেক্ষক একজন নিয়ামক ক্রিয়াকলাপের উপর নির্ভরশীল হওয়ার জন্য আমার একটি (যুক্তিসঙ্গত ভিত্তিতে, আমি মনে করি) বিরক্তিও বোধ করি। হঠাৎ করে আপনাকে যে কোনও নিয়ামক পদক্ষেপে (বা অন্য কোনও মডেল) আপনার পর্যবেক্ষককে ইনজেকশন দিতে হবে যা আপনি লক্ষ্য করেছেন এমন মডেলটি আপডেট করতে পারে। আপনি যদি গ্যারান্টি দিতে পারেন তবে আপনার অ্যাপ্লিকেশনটি কেবল তৈরি / আপডেট নিয়ন্ত্রক ক্রিয়াকলাপের মাধ্যমে আপনার কাছে আরও শক্তির মাধ্যমে উদাহরণস্বরূপ পরিবর্তন করতে পারে, তবে এটি কোনও রেল অ্যাপ্লিকেশন (নেস্টেড ফর্মগুলি, মডেল বিজনেস লজিক আপডেটিং অ্যাসোসিয়েশনগুলি ইত্যাদি বিবেচনা করুন) সম্পর্কে করবো ass


1
@Agmin মন্তব্য করার জন্য ধন্যবাদ। আমি যদি সেখানে আরও ভাল ডিজাইনের প্যাটার্ন খুঁজে পাই তবে একটি পর্যবেক্ষক ব্যবহার করা থেকে সরে আসতে পেরে আমি খুশি। অন্যান্য ব্যক্তিরা কীভাবে অনুরূপ কার্যকারিতা সরবরাহ করার জন্য তাদের কোড এবং নির্ভরতাগুলি কাঠামোবদ্ধ করছেন তাতে আমি আগ্রহী (ক্যাশে বাদে)। আমার ক্ষেত্রে, আমি কোনও মডেলের বৈশিষ্ট্যগুলি আপডেট হওয়ার পরে যে পরিবর্তনগুলি রেকর্ড করতে চাই। আমি এটি করতে একটি পর্যবেক্ষক ব্যবহার করতাম। আমি এখন ফ্যাট কন্ট্রোলার, এআর কলব্যাক বা অন্য কিছু যা ভাবিনি ভেবেছিলাম তার মধ্যে সিদ্ধান্ত নেওয়ার চেষ্টা করছি। এই মুহূর্তে মার্জিত মনে হয় না।
কেনেচ

13

উইসপার একটি দুর্দান্ত সমাধান। কলব্যাকগুলির জন্য আমার ব্যক্তিগত পছন্দটি হ'ল তারা মডেলগুলি দ্বারা বরখাস্ত হন তবে ইভেন্টগুলি কেবল তখনই শোনা যায় যখন কোনও অনুরোধ আসে অর্থাৎ আমি পরীক্ষাগুলিতে মডেল স্থাপন করার সময় কলব্যাকগুলি বরখাস্ত করতে চাই না তবে আমি সেগুলি চাই নিয়ন্ত্রকরা জড়িত যখনই বরখাস্ত। উইসপারের সাথে এটি সেটআপ করা সত্যিই সহজ কারণ আপনি এটি কেবল একটি ব্লকের ভিতরে থাকা ইভেন্টগুলি শোনার জন্য বলতে পারেন।

class ApplicationController < ActionController::Base
  around_filter :register_event_listeners

  def register_event_listeners(&around_listener_block)
    Wisper.with_listeners(UserListener.new) do
      around_listener_block.call
    end
  end        
end

class User
  include Wisper::Publisher
  after_create{ |user| publish(:user_registered, user) }
end

class UserListener
  def user_registered(user)
    Analytics.track("user:registered", user.analytics)
  end
end


4

রেল 3 পর্যবেক্ষকের কাছে আমার বিকল্প হ'ল একটি ম্যানুয়াল বাস্তবায়ন যা মডেলটির মধ্যে সংজ্ঞায়িত কলব্যাকটি ব্যবহার করে তবে (উপরের উত্তরটিতে কৃষ্ণাঙ্গ রাষ্ট্র হিসাবে) "নির্ভরতা ফ্লিপ করুন ... সংযুক্তি"।

আমার অবজেক্টগুলি বেস ক্লাস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত যা পর্যবেক্ষকদের নিবন্ধকরণের জন্য সরবরাহ করে:

class Party411BaseModel

  self.abstract_class = true
  class_attribute :observers

  def self.add_observer(observer)
    observers << observer
    logger.debug("Observer #{observer.name} added to #{self.name}")
  end

  def notify_observers(obj, event_name, *args)
    observers && observers.each do |observer|
    if observer.respond_to?(event_name)
        begin
          observer.public_send(event_name, obj, *args)
        rescue Exception => e
          logger.error("Error notifying observer #{observer.name}")
          logger.error e.message
          logger.error e.backtrace.join("\n")
        end
    end
  end

end

(অনুমোদিত, উত্তরাধিকারের উপর গঠনের চেতনায়, উপরের কোডটি একটি মডিউলে রাখা যেতে পারে এবং প্রতিটি মডেলে মিশ্রিত করা যেতে পারে))

একজন ইনিশিয়ালাইজার পর্যবেক্ষকদের নিবন্ধন করে:

User.add_observer(NotificationSender)
User.add_observer(ProfilePictureCreator)

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

class User < Party411BaseModel

  self.observers ||= []

  after_commit :notify_observers, :on => :create

  def signed_up_via_lunchwalla
    self.account_source == ACCOUNT_SOURCES['LunchWalla']
  end

  def notify_observers
    notify_observers(self, :new_user_created)
    notify_observers(self, :new_lunchwalla_user_created) if self.signed_up_via_lunchwalla
  end
end

এই ইভেন্টগুলির জন্য বিজ্ঞপ্তি পেতে ইচ্ছুক যে কোনও পর্যবেক্ষককে কেবল (1) মডেলটির সাথে নিবন্ধন করতে হবে যা ইভেন্টটি প্রকাশ করে এবং (2) এমন একটি পদ্ধতি রয়েছে যার নাম ইভেন্টটির সাথে মেলে। যেমনটি আশা করা যায়, একাধিক পর্যবেক্ষক একই ইভেন্টের জন্য নিবন্ধন করতে পারবেন এবং (মূল প্রশ্নের দ্বিতীয় অনুচ্ছেদের প্রসঙ্গে) একটি পর্যবেক্ষক বেশ কয়েকটি মডেল জুড়ে ইভেন্টগুলি দেখতে পারবেন।

নীচের নোটিফিকেশনসেন্ডার এবং প্রোফাইলপিকচারচারী পর্যবেক্ষক ক্লাসগুলি বিভিন্ন মডেলের দ্বারা প্রকাশিত ইভেন্টগুলির জন্য পদ্ধতিগুলি সংজ্ঞায়িত করে:

NotificationSender
  def new_user_created(user_id)
    ...
  end

  def new_invitation_created(invitation_id)
    ...
  end

  def new_event_created(event_id)
    ...
  end
end

class ProfilePictureCreator
  def new_lunchwalla_user_created(user_id)
    ...
  end

  def new_twitter_user_created(user_id)
    ...
  end
end

একটি সতর্কতা হ'ল সমস্ত মডেলের জুড়ে সমস্ত ইভেন্টের নাম অবশ্যই অনন্য হতে হবে।


3

আমি মনে করি পর্যবেক্ষকদের অবহেলিত হওয়া বিষয়টি পর্যবেক্ষকরা নিজের মধ্যে খারাপ ছিল তা নয়, বরং তারা আপত্তিজনক ব্যবহার হচ্ছিল।

আমি যদি আপনার কলব্যাকগুলিতে খুব বেশি যুক্তি যুক্ত করা বা পর্যবেক্ষকের আচরণ অনুকরণ করার জন্য কোডের চারপাশে সরানো কোডের বিরুদ্ধে সাবধানতা অবলম্বন করব যখন ইতিমধ্যে পর্যবেক্ষক প্যাটার্নটির এই সমস্যার কোনও সমাধান রয়েছে।

যদি পর্যবেক্ষকদের ব্যবহার করতে এটি বোধগম্য হয় তবে সমস্ত উপায়ে পর্যবেক্ষক ব্যবহার করুন। কেবল বুঝতে পারেন যে আপনার পর্যবেক্ষক যুক্তিযুক্ত শব্দ কোডিং অনুশীলনগুলি উদাহরণস্বরূপ সলাইড অনুসরণ করে তা নিশ্চিত করতে হবে।

আপনি যদি এটিকে আপনার প্রকল্পে আবার যুক্ত করতে চান তবে পর্যবেক্ষক রত্নটি রুবিজেমেজে উপলব্ধ রয়েছে https://github.com/rails/rails-raservers

এই সংক্ষিপ্ত থ্রেডটি দেখুন, সম্পূর্ণ বিস্তৃত আলোচনা না করেই আমি মনে করি যে মূল যুক্তিটি বৈধ। https://github.com/rails/rails-observers/issues/2


2

আপনি https://github.com/TiagoCardoso1983/association_observers চেষ্টা করতে পারেন । এটি এখনও রেল 4 এর জন্য পরীক্ষা করা হয়নি (যা এখনও চালু হয়নি) এবং আরও কিছু সহযোগিতার প্রয়োজন, তবে এটি পরীক্ষা করতে পারে যে এটি আপনার জন্য কৌশলটি করে কিনা।


2

পরিবর্তে একটি পোরো ব্যবহার সম্পর্কে কীভাবে?

এর পিছনে যুক্তিটি হ'ল আপনার 'সংরক্ষণের অতিরিক্ত ক্রিয়াকলাপ' সম্ভবত ব্যবসায়িক যুক্তি হতে চলেছে। এটি আমি উভয় এআর মডেল থেকে পৃথক রাখতে চাই (যা যথাসম্ভব সহজ হওয়া উচিত) এবং নিয়ন্ত্রকরা (যা সঠিকভাবে পরীক্ষা দেওয়ার জন্য বিরক্তিকর)

class LoggedUpdater

  def self.save!(record)
    record.save!
    #log the change here
  end

end

এবং কেবল এটিকে কল করুন:

LoggedUpdater.save!(user)

এমনকি অতিরিক্ত পোস্ট-সেভ অ্যাকশন অবজেক্ট ইনজেকশনের মাধ্যমে আপনি এটিতে প্রসারিতও করতে পারেন

LoggedUpdater.save(user, [EmailLogger.new, MongoLogger.new])

এবং 'অতিরিক্ত' উদাহরণ দেওয়ার জন্য। আপনি এগুলি কিছুটা বাড়িয়ে দিতে চাইলেও:

class EmailLogger
  def call(msg)
    #send email with msg
  end
end

আপনি যদি এই পদ্ধতির পছন্দ করেন তবে আমি ব্রায়ান হেলক্যাম্পস 7 প্যাটার্নস ব্লগ পোস্ট পড়ার পরামর্শ দিচ্ছি ।

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

class LoggedUpdater

  def self.save!([records])
    ActiveRecord::Base.transaction do
      records.each(&:save!)
      #log the changes here
    end
  end

end

0

এটি উল্লেখ করার মতো যে Observableরুবি স্ট্যান্ডার্ড লাইব্রেরির মডিউল উদাহরণ পদ্ধতিগুলি থেকে সক্রিয়-রেকর্ড-মতো বস্তুগুলিতে ব্যবহার করা যাবে না changed?এবং changedসেগুলির সাথে সংঘর্ষ হবে ActiveModel::Dirty

কারাগারের জন্য বাগ রিপোর্ট 2.3.2


-2

আমারও একই প্রোবজেম! অ্যাক্টিভোডেল :: নোংরা আমি একটি সমাধান পেয়েছি যাতে আপনি নিজের মডেলের পরিবর্তনগুলি ট্র্যাক করতে পারেন!

include ActiveModel::Dirty
before_save :notify_categories if :data_changed? 


def notify_categories
  self.categories.map!{|c| c.update_results(self.data)}
end

http://api.rubyonrails.org/classes/ActiveModel/Dirty.html

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