只有在Rails 5中首次创建对象(模型)时,如何调用方法?

时间:2017-01-05 22:12:13

标签: ruby-on-rails model ruby-on-rails-5 instantiation

我正在使用Rails 5.我想在我的模型上首次创建模型时调用一个方法。我试过这个......

class UserSubscription < ApplicationRecord

  belongs_to :user
  belongs_to :scenario

  def self.find_active_subscriptions_by_user(user)
    UserSubscription.joins(:scenario)
        .where(["user_id = ? and start_date < NOW() and end_date > NOW()", user.id])
  end

  after_initialize do |user_subscription|
    self.consumer_key = SecureRandom.urlsafe_base64(10)
    self.consumer_secret = SecureRandom.urlsafe_base64(25)
  end

end

但是我注意到每次尝试都会调用它,除了创建它之外,我还会从finder方法中检索模型。如何在我的模型中创建这样的功能?

2 个答案:

答案 0 :(得分:0)

您希望使用在{5}中引入的after_create_commitactive record docs)或after_commit :hook, on: :create作为after_create的快捷方式。

after_create_commit总是在事务块之后执行,而switch在提交之后但在相同的事务块中执行。这些细节在这里可能无关紧要,但如果您需要额外的控制来确保模型状态在执行后调用之前是正确的,那么这是一项新功能。

答案 1 :(得分:0)

Pyrce的回答很好。另一种方法是保留after_initialize方法,但只有在它成为新记录时才会运行:

after_initialize :set_defaults 
def set_defaults
  if self.new_record?
    self.consumer_key = SecureRandom.urlsafe_base64(10)
    self.consumer_secret = SecureRandom.urlsafe_base64(25)
  end
end

(通常认为最好不要覆盖after_initialize方法。而是提供要运行的方法的名称,如上所述。