如何在ActiveRecord中的其他操作之前处理需要执行的操作,例如 destroy 但强制某些人专门选择此操作?
例如,在我们的团队中,我们的FacebookToken模型中有Facebook令牌。当我们删除一个令牌时,它也应该从Facebook销毁,所以我们最终会得到类似的东西:
Array
(
[0] => Array
(
[product_ID] => 1
[amount] => 2.00
)
[1] => Array
(
[product_ID] => 5
[amount] => 6.00
)
)
但这需要知道代码。例如,当有新人到达团队时,可以写下:
[1] => Array
(
[product_ID] => 5
[amount] => 6.00
)
当然,我们可以在操作之前/之后使用,但代码编写者并不总是知道如果我们有一个大的代码库。或者,如果它只是测试一些东西,或许它不想从Facebook删除令牌。
我想有办法强制命名参数而不用猴子修补ActiveRecord,所以我们最终会得到这样的结果:
if token.delete_from_facebook
token.destroy
end
这样,读者可以明确知道它在做什么。
我想知道这是不是一个好习惯,也是一种做法。
答案 0 :(得分:1)
您只能在destroy
模型上覆盖Token
方法,例如:
class Token < ApplicationRecord
# scopes, associations, other methods, etc.
def destroy(delete_from_facebook: false)
facebook_delete if delete_from_facebook
super()
end
private
def facebook_delete
# code to delete `Token` from facebook.
end
end
现在您可以像往常一样调用token.destroy
来删除记录,也可以像往常一样调用token.destroy(delete_from_facebook: true)
删除记录并执行{{1方法。