私は、お互いにHABTM関係を持つ2つのActiveRecordモデルを持っています。 チェックボックスをオンにしてゾーンを追加できるようなフォームでAccessUnitを追加すると、渡されたアクセスユニットをシリアル化できないため、AccessUnitUpdaterJobをエンキューできないという例外が発生します(識別子が欠落しているため)。プライマリオブジェクトでsaveを手動で呼び出すと、問題は解決されますが、これは回避策であり、適切な修正ではありません。Rails HABTM after_addコールバックは、プライマリオブジェクトを保存する前に起動します。
TLDR;メインオブジェクトが保存される前にafter_addコールバックがトリガーされたようです。これがRailsのバグか期待される振る舞いであるかどうかは確かに分かりません。私の視点では
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は、「Association extensions」セクションでafter_addが保存前にトリガーされるかどうかを指定する必要があります。 – kshikama