Geri aramayı yalnızca Rails'de bir öznitelik değiştiyse çalıştırın


100

Uygulamamda aşağıdaki ilişkilendirmeye sahibim:

# Page 
belongs_to :status

Bir geri arama her zaman çalıştırmak istediğiniz status_ida pagedeğişti.

Yani, page.status_id4'ten 5'e giderse, bunu yakalamak isterim.

Nasıl yapmalı?

Yanıtlar:


209

Raylar 5.1+

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

  private

  def do_something
    # ...
  end
end

ActiveRecord :: Dirty'yi değiştiren taahhüt burada: https://github.com/rails/rails/commit/16ae3db5a5c6a08383b974ae6c96faac5b4a3c81

İşte bu değişikliklerle ilgili bir blog yazısı: https://www.ombulabs.com/blog/rails/upgrades/active-record-5-1-api-changes.html

ActiveRecord :: Dirty in Rails 5.1+ üzerinde yaptığım değişikliklerin özeti:

ActiveRecord :: Kirli

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

Kaydetmeden Önce (İSTEĞE BAĞLI DEĞİŞİKLİK)

Bir nesneyi değiştirdikten sonra ve veritabanına kaydetmeden önce veya before_savefiltre içinde :

  • changes şimdi olmalı changes_to_save
  • changed? şimdi olmalı has_changes_to_save?
  • changed şimdi olmalı changed_attribute_names_to_save
  • <attribute>_change şimdi olmalı <attribute>_change_to_be_saved
  • <attribute>_changed? şimdi olmalı will_save_change_to_<attribute>?
  • <attribute>_was şimdi olmalı <attribute>_in_database

Kaydettikten Sonra (KIRILMA DEĞİŞİMİ)

Bir nesneyi değiştirdikten ve veritabanına kaydettikten sonra veya after_savefiltre içinde :

  • saved_changes(değiştirir previous_changes)
  • saved_changes?
  • saved_change_to_<attribute>
  • saved_change_to_<attribute>?
  • <attribute>_before_last_save

Raylar <= 5.0

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

  private

  def do_something
    # ...
  end
end

Bu, before_savegeri aramanın, bir yöntem çağrısının dönüş değerine dayalı olarak koşullu olarak yürütülebileceği gerçeğini kullanır . status_id_changed?Yöntem geliyor ActiveModel :: Kirli belirli nitelik basitçe ekleyerek değişip değişmediğini bize kontrol etmenizi sağlar, _changed?özellik adı ile.

Ne zaman do_somethingçağrılmalıdır yöntem ihtiyaçlarınıza kalmıştır. Olabilir before_saveya after_saveya herhangi tanımlanmış ActiveRecord :: Httpserversockethandler .


4
Bu çözüm, daha yeni sürümlerde kullanımdan kaldırılmıştır.
Mateus Luiz

6
Rails 5.1+ bilgisi ile güncellendi.
pdobb

16

attribute_changed?Şimdi sadece kullanmak, Raylar 5.1 önerilmiyor will_save_change_to_attribute?.

Daha fazla bilgi için bu konuya bakın .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.