推荐的处理所需参数的方法

时间:2017-05-15 17:05:59

标签: ruby-on-rails

如何在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

这样,读者可以明确知道它在做什么。

我想知道这是不是一个好习惯,也是一种做法。

1 个答案:

答案 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方法。