簡體   English   中英

如何在Ruby on Rails的模型類中引用模型的實例?

[英]How do you refer an instance of a model in model class in Ruby on Rails?

我正在嘗試在Rails中引用User類的實例進行地理編碼

class User < ActiveRecord::Base
  geocoded_by :address

  after_validation GeocodeJob.perform_later(self), if: :address_changed?
end

我要傳遞的是用戶的當前實例。 但是,很明顯,我最終傳遞的是類而不是實例,因此無法啟動我的工作隊列。

如何在模型回調中引用和傳遞用戶實例? 我知道我可以使用控制器使用實例變量,想知道是否可以將隊列直接作為模型回調。

使用當前編寫的內容,將在加載類時調用GeocodeJob.perform_later(self)並將其返回值用作傳遞給after_validation調用的參數。 正如您所說,這不是您想要的。

相反,您可以為方法傳遞符號,如下所示:

class User < ActiveRecord::Base
  geocoded_by :address

  after_validation :setup_geocode_job, if: :address_changed?

  def setup_gecode_job
    GeocodeJob.perform_later(self)
  end
end

這將通過調用模型的實例方法來完成您想要的操作,而self將成為模型實例。

請參閱: http : //api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

直接使用ActiveRecord實例作為作業參數絕對不是一個好主意。 這里的主要問題是將Ruby對象序列化為某種可寫格式(JSON,YAML等)。 鏈接以了解更多信息:

要在作業工作者上下文中訪問ActiveRecord實例,最好通過給定的id值查找記錄:

class GeocodeJob < ActiveJob::Base
  def perform(user_id)
    user = User.find user_id
    # do hard geocode work here
  end
end

從回調開始工作,例如:

class User < ActiveRecord::Base
  geocoded_by :address

  after_validation if: :address_changed? do |user|
    GeocodeJob.perform_later(user.id)
  end
end

PS 我強烈建議使用after_commit回調而不是after_validation因為有時在其他回調中可能會取消記錄保存過程,或者如果出現數據庫問題。 這里還有一件事-如果以前沒有保存過用戶(例如User.create(...) ),則其實例沒有id值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM