私が知る限り、検証は callbacks の前に実行されると想定されています。ただし、そうでないことを示唆する動作が発生しています。具体的には、私は持っています:
class User::GroupInvitation < ActiveRecord::Base
validate :user_can_be_invited
before_create :find_or_create_membership
private
def user_can_be_invited
user_membership = User::Membership.where(:group_id => self.group_id, :user_id => self.invitee_id).first
if user_membership.present?
case user_membership.status
when "invited"
errors[:base] << I18n.t("user.group_invitations.create.this_user_is_already_invited")
end
end
end
def find_or_create_membership
user_membership = User::Membership.where(:group_id => self.group_id, :user_id => self.invitee_id).first_or_create(:status => "invited")
user_membership.update_column(:status, "invited") unless user_membership.new_record?
self.user_membership_id = user_membership.id
end
end
このコードをテストすると、ユーザーが以前に招待されていない場合でも、「このユーザーは既に招待されています」というエラーが一貫して表示されます。find_or_create_membership
が最初に実行され、それによって に設定status
されるため、これが発生していると推測できますinvited
。何が起こっているか、または状況を解決する方法についてのアイデアはありますか?