Rails 3.2中的范围回调

时间:2014-10-14 21:51:14

标签: ruby-on-rails-3 callback scope

我有一个邀请系统,用户可以通过以下两种方式之一获取邀请 - 来自网站(即,他们发现我们没有邀请)或来自current_user

如果邀请来自current_user,则invitation.sender_id设置为current_user.id。如果邀请来自网站,则invitation.sender_id设置为" 0" (整数)。

LOGIC:

  1. current_user可以发送多个邀请,但只能向一个唯一的电子邮件地址发送一次邀请。
  2. 网站访问者可以请求将邀请发送到他们的电子邮件地址,但前提是他们之前没有亲自请求邀请。
  3. 模型中的before_create回调 - invitation.rb应该检查邀请请求的范围,并仅在unique = true的上下文中验证invitation.sender_id
  4. 电子邮件可以在邀请表中多次驻留,但不能在同一个sender_id下。
  5. 我试图在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',并允许保存记录。谁知道为什么?

1 个答案:

答案 0 :(得分:0)

将回调拆分为2并没有解决问题。首先,我的逻辑被逆转了。它期望它返回false,但是回写的方式,它返回true。

在我解决这个问题之前,我已经摆弄了这个以及一个类似的案例一周:

validates :[attribute_name], uniqueness: { scope: :attribute_name }

例如:

validates :recipient_email, uniqueness: { scope: :sender_id }

如果需要,您可以将其他{options}附加到链上。