我有一个邀请系统,用户可以通过以下两种方式之一获取邀请 - 来自网站(即,他们发现我们没有邀请)或来自current_user
。
如果邀请来自current_user
,则invitation.sender_id
设置为current_user.id
。如果邀请来自网站,则invitation.sender_id
设置为" 0" (整数)。
LOGIC:
current_user
可以发送多个邀请,但只能向一个唯一的电子邮件地址发送一次邀请。before_create
回调 - invitation.rb
应该检查邀请请求的范围,并仅在unique = true
的上下文中验证invitation.sender_id
。我试图在Stack和其他地方找到解决方案,但我无法找到提供解决方案的任何内容。
如何将before_create
回调范围限制为invitation.sender_id
?
修改
我认为我要做的就是将回调分成2 ...
before_create :recipient_has_no_requested_invitation
before_create :sender_has_not_invited_recipient, :if => :sender
def recipient_has_no_requested_invitation
if Invitation.exists?(sender_id: 0, recipient_email: :recipient_email)
errors.add :recipient_email, 'An invitation has already been sent to that email address.'
end
end
def sender_has_not_invited_recipient
if Invitation.exists?(sender_id: :current_user, recipient_email: :recipient_email)
errors.add :recipient_email, 'You have already sent an invitation to that person.'
end
end
此代码看起来不错,但回调正在返回' true'而不是' false',并允许保存记录。谁知道为什么?
答案 0 :(得分:0)
将回调拆分为2并没有解决问题。首先,我的逻辑被逆转了。它期望它返回false,但是回写的方式,它返回true。
在我解决这个问题之前,我已经摆弄了这个以及一个类似的案例一周:
validates :[attribute_name], uniqueness: { scope: :attribute_name }
例如:
validates :recipient_email, uniqueness: { scope: :sender_id }
如果需要,您可以将其他{options}
附加到链上。