我正在使用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方法中检索模型。如何在我的模型中创建这样的功能?
答案 0 :(得分:0)
您希望使用在{5}中引入的after_create_commit
(active 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
方法。而是提供要运行的方法的名称,如上所述。