কীভাবে আমি অ্যাক্টিভেকর্ড কলব্যাক চালানো এড়াতে পারি?


140

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

Person#save( :run_callbacks => false )

অথবা

Person#save_without_callbacks

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

হালনাগাদ

আমি একটি ব্লগ পোস্ট পেয়েছি যা ব্যাখ্যা করে যে আপনি কীভাবে মডেল থেকে কলব্যাকগুলি সরিয়ে ফেলতে পারেন:

Foo.after_save.clear

সেই পদ্ধতিটি কোথায় নথিবদ্ধ হয়েছে তা আমি খুঁজে পাইনি তবে এটি কাজ করে বলে মনে হচ্ছে।


8
আপনি যদি কলব্যাকে ধ্বংসাত্মক বা ব্যয়বহুল (ইমেল প্রেরণের মতো) কিছু করছেন তবে আমি এটিকে বাইরে নিয়ে যাওয়া এবং নিয়ামক বা অন্য কোথাও থেকে আলাদাভাবে ট্রিগার করার পরামর্শ দিচ্ছি। এইভাবে আপনি এটিকে "দুর্ঘটনাক্রমে" বিকাশে ইত্যাদিতে ট্রিগার করবেন না

2
আপনি গৃহীত সমাধানটি আমার পক্ষে কাজ করছে না। আমি রেল 3 ব্যবহার করছি 3. আমি এর মতো একটি ত্রুটি পাচ্ছি: - # <ব্যবহারকারীর জন্য 0x10ae9b848>
মোহিত জৈন

হ্যাঁ যে ব্লগ পোস্টটি কাজ করেছে ....
মোহিত জৈন

1
সংশ্লিষ্ট প্রশ্ন: stackoverflow.com/questions/19449019/...
Allerin

Foo.after_save.clearপুরো মডেলের কলব্যাকগুলি সরিয়ে দেবে না ? এবং তারপরে আপনি কীভাবে এগুলি পুনরুদ্ধার করার প্রস্তাব দিচ্ছেন?
জোশুয়া পিন্টার

উত্তর:


72

এই দ্রষ্টব্যটি কেবলমাত্র 2 রেল।

আমি কেবল এটি তদন্ত করেছি এবং আমি মনে করি আমার একটি সমাধান আছে। দুটি অ্যাক্টিভেকর্ডের ব্যক্তিগত পদ্ধতি রয়েছে যা আপনি ব্যবহার করতে পারেন:

update_without_callbacks
create_without_callbacks

এই পদ্ধতিগুলি কল করতে আপনাকে প্রেরণ ব্যবহার করতে হবে। উদাহরণ:

p = Person.new(:name => 'foo')
p.send(:create_without_callbacks)

p = Person.find(1)
p.send(:update_without_callbacks)

এটি অবশ্যই এমন একটি বিষয় যা আপনি কেবল কনসোলে বা কিছু এলোমেলো পরীক্ষা করার সময় ব্যবহার করতে চান। আশাকরি এটা সাহায্য করবে!


7
এটা আমার জন্য কাজ করে না। আমি রেল 3 ব্যবহার করছি 3. আমি এর মতো একটি ত্রুটি পাচ্ছি: - # <ব্যবহারকারীর জন্য 0x10ae9b848>
মোহিত জৈন

আপনার পরামর্শটি কাজ করছে না তবে আপডেট অংশে উল্লিখিত ব্লগ পোস্টটি কাজ করছে ..
মোহিত জৈন

এটি বৈধতাও এড়িয়ে যাবে।
ড্যানিয়েল পাইটসচ

রেলের কোনও সংস্করণের জন্য আমার কাছে আরও একটি সমাধান রয়েছে। এটা আমাদের জন্য ভাল কাজ করে। এটি আমার ব্লগ পোস্টে দেখুন: Railsguides.net/2014/03/25/skip-callbacks-in-tests
ka8725

224

ব্যবহারের update_column(পাগল> = v3.1) অথবা update_columns(পাগল> = 4.0) callbacks এবং যাচাই এড়িয়ে যেতে। এছাড়াও এই পদ্ধতিগুলির সাথে আপডেট করা updated_atহয় না

#Rails >= v3.1 only
@person.update_column(:some_attribute, 'value')
#Rails >= v4.0 only
@person.update_columns(attributes)

http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-update_column

# 2: কলব্যাকগুলি এড়ানো যায় যা কোনও অবজেক্ট তৈরি করার সময়ও কাজ করে

class Person < ActiveRecord::Base
  attr_accessor :skip_some_callbacks

  before_validation :do_something
  after_validation :do_something_else

  skip_callback :validation, :before, :do_something, if: :skip_some_callbacks
  skip_callback :validation, :after, :do_something_else, if: :skip_some_callbacks
end

person = Person.new(person_params)
person.skip_some_callbacks = true
person.save

2
এটা দেখে মনে হচ্ছে পাশাপাশি 2.x সাথে কাজ করে, এবং অন্যান্য পদ্ধতি যে একভাবে চালনা একটি হোস্ট আছেন: guides.rubyonrails.org/...
rogerdpack

15
এটি :create_without_callbacksসম্বোধন করে না :( আমি কীভাবে এরকম কিছু চালাতে পারি? (রেল 2 এ কাজ করা, রেল 3 এ সরানো)
nzifnab

ধরে নেওয়া @personযে কোনও জায়গায় নিয়ামকের ক্ষেত্রে একটি পরিবর্তনশীল, এই সমাধানটির অর্থ হল আপনার মডেল শ্রেণি পড়ার লোকেরা কলব্যাকগুলি বুঝতে সক্ষম হবে না। তারা দেখতে পাবে after_create :something_coolএবং ভাববে "দুর্দান্ত, তৈরি হওয়ার পরে শীতল কিছু ঘটে!"। প্রকৃতপক্ষে আপনার মডেল শ্রেণিটি বুঝতে, আপনার সমস্ত কন্ট্রোলারের মাধ্যমে তাদের গ্রেপ করতে হবে, যেখানে আপনি যুক্তি সংযোগ দেওয়ার সিদ্ধান্ত নিয়েছেন এমন সমস্ত ছোট জায়গাগুলি সন্ধান করতে হবে। আমি এটি পছন্দ করি না> ও <;;
জিগি

1
প্রতিস্থাপন skip_callback ..., if: :skip_some_callbacksসঙ্গে after_create ..., unless: :skip_some_callbacksafter_create সাথে যথাযথভাবে এই চালানোর জন্য।
সাকুরাশিঙ্কেন 21

28

আপডেট করা হয়েছে:

@ বিকান্ত চৌধুরী এর সমাধান আরও ভাল বলে মনে হচ্ছে:

#Rails >= v3.1 only
@person.update_column(:some_attribute, 'value')
#Rails >= v4.0 only
@person.update_columns(attributes)

আমার মূল উত্তর:

এই লিঙ্কটি দেখুন: কীভাবে অ্যাক্টিভেকর্ড কলব্যাকগুলি এড়ানো যায়?

রেল 3 এ,

ধরুন আমাদের ক্লাস সংজ্ঞা রয়েছে:

class User < ActiveRecord::Base
  after_save :generate_nick_name
end 

Approach1:

User.send(:create_without_callbacks)
User.send(:update_without_callbacks)

অ্যাপ্রোচ 2: আপনি যখন তাদের আপনার আরএসপেক ফাইলগুলিতে বা যেকোন কিছুতে এড়াতে চান, এটি চেষ্টা করুন:

User.skip_callback(:save, :after, :generate_nick_name)
User.create!()

দ্রষ্টব্য: একবার এটি হয়ে গেলে আপনি আরএসপেক পরিবেশে না থাকলে আপনার কলব্যাকগুলি পুনরায় সেট করা উচিত:

User.set_callback(:save, :after, :generate_nick_name)

3.0.5 রেলের উপরে আমার জন্য কাজ করে


20

রেল 3:

MyModel.send("_#{symbol}_callbacks") # list  
MyModel.reset_callbacks symbol # reset

11
খুশী হলাম। এছাড়াও সুনির্দিষ্ট নিয়ন্ত্রণের জন্য মাইমোডেল.স্কিপ_ক্যালব্যাক (: তৈরি,: পরে,: আমার_ক্যালব্যাক) .. অ্যাক্টিভসপোর্ট :: কলব্যাকস :: সমস্ত লোবাংয়ের জন্য ক্লাসমেথডস ডকস
টারডেট

4
দরকারী তথ্য: 'প্রতীক' ইন reset_callbacksনয় :after_save, বরং :saveapidock.com/rails/v3.0.9/ActtiveSupport/Callbacks/ClassMethods/…
নেসুর

19

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

class ImportedPerson < ActiveRecord::Base
  self.table_name = 'people'
end

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

ImportedPerson.new( person_attributes )

4
সর্বদা সেরা সমাধান। মার্জিত এবং সহজ!
রাফায়েল অলিভিরা

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

1
এখন পর্যন্ত সর্বোত্তম উত্তর
রোবোক 2

1
উত্সাহিত করা হয়েছে কারণ এটি দেখায় যে কীভাবে বিদ্যমান রেলের সীমাবদ্ধতাগুলি ঘিরে কাজ করা যায় এবং পুরো অবজেক্ট এমভিসি কীভাবে কাজ করে তা বুঝতে আমাকে সহায়তা করে। তাই সহজ এবং পরিষ্কার।
মাইকেল স্মিটজ

17

আপনি নিজের ব্যক্তি মডেলটিতে এরকম কিছু চেষ্টা করতে পারেন:

after_save :something_cool, :unless => :skip_callbacks

def skip_callbacks
  ENV[RAILS_ENV] == 'development' # or something more complicated
end

সম্পাদনা: পরে_সভ একটি প্রতীক নয়, তবে এটি আমি এটি তৈরি করার চেষ্টা করেছি এমন কমপক্ষে 1,000 বার time


1
আমি সত্যিই মনে করি এটি এখানে সেরা উত্তর। এই যুক্তিটি যা কলব্যাকটি এড়িয়ে যায় কখন তা নির্ধারণ করে তা মডেলটিতে পাওয়া যায় এবং ব্যবসায়ের যুক্তিটি ফিরিয়ে দেওয়া, বা এর সাথে এনক্যাপসুলেশন সংক্রামিত করার মতো আপনার কাছে ক্রেজি কোডের টুকরোগুলি নেই send। KOODOS
Ziggy

10

আপনি ব্যবহার করতে পারেন update_columns:

User.first.update_columns({:name => "sebastian", :age => 25})

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


7

সমস্ত আফটার_সেভ কলব্যাকগুলি প্রতিরোধের একমাত্র উপায় হ'ল প্রথমটি ফেরত আসা মিথ্যা।

সম্ভবত আপনি (অরীক্ষিত) এর মতো কিছু চেষ্টা করতে পারেন:

class MyModel < ActiveRecord::Base
  attr_accessor :skip_after_save

  def after_save
    return false if @skip_after_save
    ... blah blah ...
  end
end

...

m = MyModel.new # ... etc etc
m.skip_after_save = true
m.save

1
আমি চেষ্টা করা (অরক্ষিত) পছন্দ করি। রোমাঞ্চ ভ্রমণ.
অদমন্তিশ

পরীক্ষিত এবং এটি কাজ করে। আমি মনে করি এটি একটি খুব ভাল এবং পরিষ্কার সমাধান, ধন্যবাদ!
কার্নিফিকেশন

5

দেখে মনে হচ্ছে এটি রেল ২.৩ এ হ্যান্ডেল করার এক উপায় (যেহেতু আপডেট_বিথআউট_ক্যালব্যাকস চলে গেছে ইত্যাদি), আপডেট_ল ব্যবহার করা হবে, যা বৈধতা এবং কলব্যাকের জন্য রেল গাইডের 12 অনুচ্ছেদ অনুযায়ী কলব্যাকগুলি এড়িয়ে চলে এমন একটি পদ্ধতি ।

এছাড়াও, মনে রাখবেন যে আপনি যদি আপনার আফটার কলব্যাকের কিছু করছেন তবে এটি অনেক সংখ্যার (যেমন একটি has_many সহযোগ, যেখানে আপনিও গ্রহণযোগ্য_নেস্ট_ট্রিবিউটস_স জন্য) ভিত্তিক একটি গণনা করেন তবে সংরক্ষণের অংশ হিসাবে আপনাকে সমিতিটি পুনরায় লোড করতে হবে , এর একজন সদস্য মোছা হয়েছে।


4

https://gist.github.com/576546

এই বানর-প্যাচটি কেবল কনফিগার / আরম্ভকারী / স্কিপ_ক্যালব্যাকস.আরবিতে ফেলে দিন

তারপর

Project.skip_callbacks { @project.save }

বা মত।

সমস্ত কৃতিত্ব লেখক


4

সর্বাধিক up-votedউত্তর কিছু ক্ষেত্রে বিভ্রান্ত বলে মনে হতে পারে।

আপনি ifযদি একটি কলব্যাক বাদ দিতে চান তবে আপনি কেবল একটি সাধারণ চেক ব্যবহার করতে পারেন :

after_save :set_title, if: -> { !new_record? && self.name_changed? }

3

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

ActiveRecord::Base.connection.execute "update table set foo = bar where id = #{self.id}"

আপনার আপডেটটি কতটা জটিল তা নির্ভর করে এটি (বা নাও) একটি বিকল্প হতে পারে। এই থেকে একটি রেকর্ড যেমন আপডেট পতাকা জন্য ভাল কাজ করে মধ্যে (কলব্যাক retriggering ছাড়া) একজন after_save কলব্যাক।


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

-1 কে মোকাবেলায় নীতিতে উত্সাহিত। আমাদের সবেমাত্র একটি প্রডাকশন ইস্যু ছিল (এর পিছনে দীর্ঘ গল্প রয়েছে) যার জন্য আমাদের একটি নতুন রেকর্ড তৈরি করতে হবে (আপডেট নয়) এবং ফায়ারিং কলব্যাকগুলি বিপর্যয়কর হত। উপরোক্ত সমস্ত উত্তর হ্যাক হয় তারা তা স্বীকার করে কিনা এবং ডিবিতে যাওয়া সেরা সমাধান ছিল। এর জন্য বৈধ শর্ত আছে। যদিও এর সাথে এসকিউএল ইঞ্জেকশন সম্পর্কে সতর্ক হওয়া উচিত #{...}
sinisterchipmunk

1
# for rails 3
  if !ActiveRecord::Base.private_method_defined? :update_without_callbacks
    def update_without_callbacks
      attributes_with_values = arel_attributes_values(false, false, attribute_names)
      return false if attributes_with_values.empty?
      self.class.unscoped.where(self.class.arel_table[self.class.primary_key].eq(id)).arel.update(attributes_with_values)
    end
  end

1

without_callbacksপ্লাগিনের জন্য এই পয়েন্টগুলির মধ্যে কোনওটিই যা আপনার প্রয়োজন ঠিক তা করে ...

class MyModel < ActiveRecord::Base
  before_save :do_something_before_save

  def after_save
    raise RuntimeError, "after_save called"
  end

  def do_something_before_save
    raise RuntimeError, "do_something_before_save called"
  end
end

o = MyModel.new
MyModel.without_callbacks(:before_save, :after_save) do
  o.save # no exceptions raised
end

http://github.com/cjbottaro/without_callbacks রেল 2.x এর সাথে কাজ করে


1

আমি একটি প্লাগইন লিখেছিলাম যা রেল 3 এ আপডেট_বিহীন_ক্যালব্যাকগুলি প্রয়োগ করে:

http://github.com/dball/skip_activerecord_callbacks

আমি মনে করি সঠিক সমাধানটি হ'ল প্রথমে কলব্যাকগুলি এড়াতে আপনার মডেলগুলি পুনরায় লিখতে হবে তবে যদি এটি অদূর ভবিষ্যতে অবাস্তব হয় তবে এই প্লাগইনটি সাহায্য করতে পারে।


1

আপনি যদি রেল 2 ব্যবহার করে থাকেন তবে কলব্যাক এবং বৈধতা ছাড়াই আপনার কলামটি আপডেট করার জন্য আপনি এসকিউএল কোয়েরি ব্যবহার করতে পারেন।

YourModel.connection.execute("UPDATE your_models SET your_models.column_name=#{value} WHERE your_models.id=#{ym.id}")

আমি মনে করি এটি যে কোনও রেল সংস্করণে কাজ করা উচিত।


1

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

মডেল:

class MyModel < ActiveRecord::Base
  before_save :do_stuff, unless: :skip_do_stuff_callback
  attr_accessor :skip_do_stuff_callback

  def do_stuff
    puts 'do stuff callback'
  end
end

টেস্ট:

m = MyModel.new()

# Fire callbacks
m.save

# Without firing callbacks
m.skip_do_stuff_callback = true
m.save

# Fire callbacks again
m.skip_do_stuff_callback = false
m.save


1

আপনি স্নিগ্ধ-সংরক্ষণ রত্ন ব্যবহার করতে পারেন: https://rubygems.org/gems/sneaky-save

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


1

4 রেলগুলির জন্য আমার একটি সমাধানের দরকার ছিল, তাই আমি এটি নিয়ে এসেছি:

অ্যাপ্লিকেশন / মডেল / উদ্বেগ / save_without_callbacks.rb

module SaveWithoutCallbacks

  def self.included(base)
    base.const_set(:WithoutCallbacks,
      Class.new(ActiveRecord::Base) do
        self.table_name = base.table_name
      end
      )
  end

  def save_without_callbacks
    new_record? ? create_without_callbacks : update_without_callbacks
  end

  def create_without_callbacks
    plain_model = self.class.const_get(:WithoutCallbacks)
    plain_record = plain_model.create(self.attributes)
    self.id = plain_record.id
    self.created_at = Time.zone.now
    self.updated_at = Time.zone.now
    @new_record = false
    true
  end

  def update_without_callbacks
    update_attributes = attributes.except(self.class.primary_key)
    update_attributes['created_at'] = Time.zone.now
    update_attributes['updated_at'] = Time.zone.now
    update_columns update_attributes
  end

end

যে কোনও মডেল:

include SaveWithoutCallbacks

তারপর তুমি পারো:

record.save_without_callbacks

অথবা

Model::WithoutCallbacks.create(attributes)

0

আপনি কেন এই উন্নয়নে সক্ষম হতে চান? অবশ্যই এর অর্থ হ'ল আপনি নিজের অ্যাপ্লিকেশনটি অবৈধ ডেটা দিয়ে তৈরি করছেন এবং এটি যেমন আশ্চর্যরকম আচরণ করবে আপনি যেমন উত্পাদন প্রত্যাশা করেন না তেমন।

আপনি যদি ডেটা দিয়ে আপনার ডিবি ডিবি স্থাপন করতে চান তবে একটি রেক টাস্কটি তৈরি করা উচিত যা বৈধ ডেটা তৈরি করতে রেকার রত্নকে ব্যবহার করে এবং ডিবিতে আপনার ইচ্ছামত যতগুলি বা কয়েকটি রেকর্ড তৈরি করে তা আমদানি করে, তবে আপনি যদি হিল হন এটির দিকে ঝুঁকুন এবং আমার একটি যুক্তিসঙ্গত কারণ আছে বলে আমি অনুমান করি যে আপডেট_বিথআউট_ক্যালব্যাকস এবং ক্রিয়েট_বিথআউট_ক্যালব্যাকগুলি ভাল কাজ করবে তবে আপনি যখন নিজের ইচ্ছায় রেল বাঁকানোর চেষ্টা করছেন তখন নিজেকে জিজ্ঞাসা করুন আপনার একটি ভাল কারণ আছে এবং আপনি যা করছেন তা সত্যিই একটি ভাল ধারণা idea


আমি বৈধতা ছাড়াই কেবল কলব্যাক ছাড়াই সংরক্ষণ করার চেষ্টা করছি না। আমার অ্যাপ্লিকেশন কল সিস্টেমে ফাইল সিস্টেমে কিছু স্ট্যাটিক এইচটিএমএল লেখার জন্য ব্যবহার করছে (সিএমএসের মতো সাজানো)। আমি ডেটা ডেটা লোড করার সময় এটি করতে চাই না।
ইথান

এটি কেবল একটি চিন্তাভাবনা ছিল, আমি অনুমান করি অতীতে যখনই আমি এই ধরণের প্রশ্নটি খারাপ কারণে স্টাফ পেতে চেষ্টা করি তা দেখেছি।
নাইটকোডার

0

একটি বিকল্প হ'ল একই টেবিলটি ব্যবহার করে এই জাতীয় হস্তক্ষেপের জন্য পৃথক মডেল রাখা:

class NoCallbacksModel < ActiveRecord::Base
  set_table_name 'table_name_of_model_that_has_callbacks'

  include CommonModelMethods # if there are
  :
  :

end

(একই দৃষ্টিভঙ্গি বৈধতাগুলি বাইপাস করার জন্য জিনিসগুলিকে আরও সহজ করে তুলতে পারে)

স্টিফেন


0

আর একটি উপায় হ'ল কলব্যাকের পরিবর্তে বৈধতা হুক ব্যবহার করা। উদাহরণ স্বরূপ:

class Person < ActiveRecord::Base
  validate_on_create :do_something
  def do_something
    "something clever goes here"
  end
end

এইভাবে আপনি ডিফল্টরূপে do_somement পেতে পারেন, তবে আপনি সহজেই এটিকে ওভাররাইড করতে পারেন:

@person = Person.new
@person.save(false)

3
এটি একটি খারাপ ধারণা বলে মনে হচ্ছে - আপনার উদ্দেশ্যগুলি তাদের উদ্দেশ্যে করা উচিত। আপনি চান সর্বশেষ জিনিসটি আপনার বৈধতাগুলির পার্শ্ব প্রতিক্রিয়া রয়েছে।
chug2k

0

ActiveRecordঅপশন বা অ্যাক্টিভেকর্ড পদ্ধতিগুলির অস্তিত্ব থাকতে পারে বা নাও থাকতে পারে তার উপর নির্ভর করে সমস্ত সংস্করণের সাথে কাজ করা এমন কিছু ।

module PlainModel
  def self.included(base)
    plainclass = Class.new(ActiveRecord::Base) do
      self.table_name = base.table_name
    end
    base.const_set(:Plain, plainclass)
  end
end


# usage
class User < ActiveRecord::Base
  include PlainModel

  validates_presence_of :email
end

User.create(email: "")        # fail due to validation
User::Plain.create(email: "") # success. no validation, no callbacks

user = User::Plain.find(1)
user.email = ""
user.save

টিএলডিআর: একই টেবিলের উপরে একটি "ভিন্ন অ্যাক্টিভেটকার্ড মডেল" ব্যবহার করুন


0

কাস্টম কলব্যাকগুলির জন্য, একটি attr_accessorএবং একটি ব্যবহার করুনunless

আপনার মডেলটি নিম্নলিখিত হিসাবে সংজ্ঞায়িত করুন:

class Person << ActiveRecord::Base

  attr_accessor :skip_after_save_callbacks

  after_save :do_something, unless: :skip_after_save_callbacks

end

এবং তারপরে আপনার যদি after_saveসংজ্ঞায়িত কলব্যাকগুলি আঘাত না করে রেকর্ডটি সংরক্ষণ করতে হয় তবে skip_after_save_callbacksভার্চুয়াল বৈশিষ্ট্যটি এতে সেট করুন true

person.skip_after_save_callbacks #=> nil
person.save # By default, this *will* call `do_something` after saving.

person.skip_after_save_callbacks = true
person.save # This *will not* call `do_something` after saving.

person.skip_after_save_callbacks = nil # Always good to return this value back to its default so you don't accidentally skip callbacks.

-5

সবচেয়ে পরিষ্কার উপায় নয়, তবে আপনি কলব্যাক কোডটি এমন অবস্থায় আবদ্ধ করতে পারেন যা রেল পরিবেশ চেক করে।

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