Rails 5 - 关系是可选的,在belongs_to存在时有条件的before_save回调

时间:2017-11-19 18:32:41

标签: ruby-on-rails callback

我有2个型号:

Card belongs_to :template, optional: true
Template has_many :cards

我想在Card上添加回调:

before_save :set_status, if: self.template.exists?

但是这会引发Card类没有方法'模板'的错误吗?

我也尝试过:

 before_save :set_status, if: self.attributes.has_key? "template_id"

before_save :set_status, if: self.template.nil?

(这也为#`)提供了NoMethodError (undefined method模板')

before_save :set_status, if: self.template.present?

那么如何检查卡片是否有模板?

修改

这是有效的,但是为什么这样做而上面没有?似乎self.template必须在方法调用中。

before_save :set_status, if: :template_exists?

def template_exists?
  return !self.template.nil?
end

1 个答案:

答案 0 :(得分:2)

before_save :set_status, if: :template_exists?

def template_exists?   
  return !self.template.nil? 
end

^此方法有效,因为回调需要它可以在运行时执行的代码。您可以向它传递一个映射到方法名称的符号或字符串,或者您可以将它传递给它可以在运行时执行的proc或lambda。但是如果你把代码传递给

before_save :set_status, if: self.template.nil?

然后它实际上会在您设置回调时尝试执行该代码,而不是在调用回调时执行。在设置回调时,self引用类Card而不是类的实例。

如果您需要更多详细信息,请参阅ActiveRecord callbacks上的一些文档。