before_validation 没有被调用?
before_validation not being called?
我遇到了一个奇怪的问题,找不到合乎逻辑的解释。
我正在调查一个错误并放置一些日志记录(通过 Rollbar),这样我就可以看到我的模型之一的一些实例的演变。
这是我得到的:
class Connexion < ActiveRecord::Base
before_validation :save_info_in_rollbar
after_save :save_info_in_rollbar
def save_info_in_rollbar
Rollbar.log("debug", "Connexion save", :connexion_id => self.id, :connexion_details => self.attributes)
end
end
现在我在 rollbar 中获取大量数据(每次连接 created/updated 时几乎有 2 行)。但奇怪的是:对于某些连接(=> 正是我正在调查的那些有错误数据的连接),我根本没有得到任何数据!
我不明白如何创建连接并将其持久保存到数据库,并且没有任何 before_validation
日志记录的踪迹。
看起来回调没有被调用,但除非我弄错了,否则它应该是回调顺序中的第一个 => 什么可以阻止它被调用?
编辑 >> 从回复中复制粘贴,可能相关:
创建或更新连接的情况有 3 种,这些情况是:
- .connexions.create()
- connexion.attr = "value"; connexion.save!
- connexion.update_attributes(属性:"value")
回调不会 运行 的唯一情况是:
- 明确跳过验证(例如
save(validate: false)
)
- 使用跳过 Ruby-land 的更新方法(部分或全部,请参阅每个方法的链接文档)并且直接 运行s SQL(例如
update_columns
, update_attribute
, update_all
).
但是:我可能漏掉了一个案例。此外,我假设 ActiveRecord/ActiveModel 中没有错误导致此问题。
首先,在实例方法中不需要self
,因为方法的范围是实例。
其次,您需要检查,您是如何将数据保存到数据库中的。您可以跳过 Rails 中的回调:Rails 3 skip validations and callbacks
第三,仔细检查数据。
抱歉问了愚蠢的问题,解释是我们有 2 个应用程序在同一个数据库上工作,而修改是由另一个应用程序进行的(当然没有发送 Rollbar 更新)。
有时候最棘手的问题有最简单的答案哈哈
我遇到了一个奇怪的问题,找不到合乎逻辑的解释。
我正在调查一个错误并放置一些日志记录(通过 Rollbar),这样我就可以看到我的模型之一的一些实例的演变。
这是我得到的:
class Connexion < ActiveRecord::Base
before_validation :save_info_in_rollbar
after_save :save_info_in_rollbar
def save_info_in_rollbar
Rollbar.log("debug", "Connexion save", :connexion_id => self.id, :connexion_details => self.attributes)
end
end
现在我在 rollbar 中获取大量数据(每次连接 created/updated 时几乎有 2 行)。但奇怪的是:对于某些连接(=> 正是我正在调查的那些有错误数据的连接),我根本没有得到任何数据!
我不明白如何创建连接并将其持久保存到数据库,并且没有任何 before_validation
日志记录的踪迹。
看起来回调没有被调用,但除非我弄错了,否则它应该是回调顺序中的第一个 => 什么可以阻止它被调用?
编辑 >> 从回复中复制粘贴,可能相关: 创建或更新连接的情况有 3 种,这些情况是:
- .connexions.create()
- connexion.attr = "value"; connexion.save!
- connexion.update_attributes(属性:"value")
回调不会 运行 的唯一情况是:
- 明确跳过验证(例如
save(validate: false)
) - 使用跳过 Ruby-land 的更新方法(部分或全部,请参阅每个方法的链接文档)并且直接 运行s SQL(例如
update_columns
,update_attribute
,update_all
).
但是:我可能漏掉了一个案例。此外,我假设 ActiveRecord/ActiveModel 中没有错误导致此问题。
首先,在实例方法中不需要self
,因为方法的范围是实例。
其次,您需要检查,您是如何将数据保存到数据库中的。您可以跳过 Rails 中的回调:Rails 3 skip validations and callbacks
第三,仔细检查数据。
抱歉问了愚蠢的问题,解释是我们有 2 个应用程序在同一个数据库上工作,而修改是由另一个应用程序进行的(当然没有发送 Rollbar 更新)。
有时候最棘手的问题有最简单的答案哈哈