我有两个ActiveRecord模型与对方有HABTM关系。 当我通过一个允许通过检查复选框添加区域的窗体添加一个AccessUnit时,我得到一个异常,即AccessUnitUpdaterJob无法排入队列,因为传递的访问单元无法被序列化(由于缺少标识符)。手动调用主对象上的保存时,问题已解决,但当然这是一种解决方法,并非适当的修复方法。Rails HABTM after_add回调在保存主对象之前触发
TLDR;看起来after_add回调在主对象被保存之前被触发。我实际上不确定这是Rails中的错误还是预期的行为。我使用Rails 5.
我遇到确切的错误是:
ActiveJob::SerializationError in AccessUnitsController#create
Unable to serialize AccessUnit without an id. (Maybe you forgot to call save?)
下面是一些代码,所以你可以看到这个问题的背景:
class AccessUnit < ApplicationRecord
has_and_belongs_to_many :zones, after_add: :schedule_access_unit_update_after_zone_added_or_removed, after_remove: :schedule_access_unit_update_after_zone_added_or_removed
def schedule_access_unit_update_after_zone_added_or_removed(zone)
# self.save adding this line solves it but isn't a proper solution
puts "Access unit #{name} added or removed to zone #{zone.name}"
# error is thrown on this line
AccessUnitUpdaterJob.perform_later self
end
end
class Zone < ApplicationRecord
has_and_belongs_to_many :access_units
end
至少看起来像http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html应该在“关联扩展”部分中指定是否在保存之前触发after_add。 – kshikama