ruby-on-rails Rails -如何覆盖ActiveRecord::Base销毁方法?

kwvwclae  于 4个月前  发布在  Ruby
关注(0)|答案(2)|浏览(68)

我有一个名为Rule的类,它继承自ActiveRecord::Base。我想覆盖继承的destroy方法来“软删除”数据库中的记录,如果我们传递一个选项来这样做的话。我想这样做:

def self.destroy(soft: false)
  soft ? soft_delete : super
end

字符串
我尝试在没有选项传递给destroy时调用super,如果soft: true传递给destroy,则调用方法soft_delete
这可以在传递soft: true时软删除一个规则,但是当我没有传递参数时,它会给我一个错误的参数数量错误:

/usr/local/bundle/gems/activerecord-7.0.4.3/lib/active_record/transactions.rb:293:in `destroy': wrong number of arguments (given 1, expected 0) (ArgumentError)


我是不是覆盖错了?
任何帮助都非常感谢。

m2xkgtsf

m2xkgtsf1#

当你调用super时,Ruby会自动包含传入的参数。所以当你不带参数调用destroy时,super会被称为super(soft: false)
当然,这是错误的,B/c ActiveRecord销毁方法不接受任何参数。
这是可行的

def self.destroy(soft: false)
  soft ? soft_delete : super() # no args included in the super method
end

字符串

bis0qfac

bis0qfac2#

你可以使用这个gem:gem "discard", "1.2.1"
你可以用discard来做软删除

user = User.kept.find_by(id: @params[:id])

user.discard!

字符串

相关问题