Ruby on rails 上的验证错误有多个关联未阻止保存

Ruby on rails 上的验证错误有多个关联未阻止保存,ruby-on-rails,rspec,Ruby On Rails,Rspec,我有一个模型eclub,它有很多邀请,我想限制可以添加的邀请数量。我的模型看起来像这样 class Eclub < ActiveRecord::Base has_many :invites, dependent: :destroy validates :invites, length: {maximum: 50, message: 'The maximum number of invites have been sent' } 如何防止将额外的invite添加到集合中?验

我有一个模型eclub,它有很多邀请,我想限制可以添加的邀请数量。我的模型看起来像这样

class Eclub < ActiveRecord::Base
    has_many :invites, dependent: :destroy
    validates :invites, length: {maximum: 50, message: 'The maximum number of invites have been sent' }

如何防止将额外的invite添加到集合中?

验证长度
用于测量字符串的长度,可能不适用于整数

您可能想尝试的是
验证:numericality=>{:maximum=>50}

编辑 是的,我这里的东西可能也不起作用,因为我们需要验证的是邀请的数量(而不是邀请协会本身),所以这里有一个定制的验证器,它应该做你想做的事情:

validate :invite_count_is_ok

private

def invite_count_is_ok
  return unless invites.present?
  errors.add(:base, "You may only have up to 50 invites at a time") unless invites.count <= 50
end
validate:invite\u count\u正常
私有的
def invite_count_是否正常
除非有人邀请,否则你会回来吗?

错误。添加(:base,“一次最多只能有50个邀请”),除非邀请。计数添加此验证的最佳位置不是在
Eclub
中,而是在
Invite
模型中。试试这个:

class Invite < ActiveRecord::Base
  belongs_to :eclub
  validate :check_invite_count!, on: :create

  private

  def check_invite_count!
    return if eclub.nil?
    if eclub.invites.count > 50
      errors.add(:base, 'Cannot add more than 50 invites for an Eclub')
    end
  end
end
classinvite50
错误。添加(:base,'不能为一个Eclub添加超过50个邀请')
结束
结束
结束

此外,此代码
验证:invests,length:{maximum:50,message:'The maximum number of invests have'}
不起作用,因为它假定
invests
为字符串。

我尝试了
验证:invests,numerical:{maximum:50}
并在工厂(:eclub)收到验证错误,即创建一个没有任何邀请的电子博客。消息为
ActiveRecord::RecordInvalid:验证失败:邀请不是数字
。我还尝试了
validates:invests,size:{maximum:50}
,但这是一个未启动的
未知验证程序:SizeValidator
错误。是的,您可能需要
:allow_blank=>true
,以便在invite计数为零时它不会爆炸。。。虽然实际上您希望它检查邀请的数量是我已经尝试了几种类似的方法,但问题是它确实将eclub标记为无效,它确实添加了错误消息,但它并不阻止将邀请添加到集合中。到目前为止唯一有效的方法是Jagdeep的建议,但我很惊讶我不能作为eclub上的验证器直接这么做。我也很惊讶我提到的原始SO帖子没有发现这个问题。我尝试了这个,但收到了与我执行Taryn East建议时相同的错误。尝试这个帖子验证了:invests的长度,最大值:50它与我上面的原始验证程序有相同的问题,它确实将eclub标记为无效,但是,在当前eclub邀请的计数中,在验证之前使用一件事并不能阻止保存额外的eclub.ohk。如果返回false和add errors.add(:your_field,“message”)的值大于您的条件,否则返回true,这一项是否有效…:)Hi bk chovatiya:如果你建议修改你的答案,最好是编辑答案进行修改。这样,原始提问者和任何其他读者都可以轻松找到他们想要的内容,而无需扫描每条评论。这是我迄今为止看到的最好的想法,我将尝试一下。对与何时运行验证相关的答案进行了编辑。谢谢,我已接受您的答案并对其进行了投票。我还对其进行了编辑以使其更干净,添加了一个nil eclub检查,并将测试更改为>=。如果一切正常,使用==应该没问题,但我已经习惯了不起作用的事情。
validate :invite_count_is_ok

private

def invite_count_is_ok
  return unless invites.present?
  errors.add(:base, "You may only have up to 50 invites at a time") unless invites.count <= 50
end
validates(
  :invites,
  numericality: {
    greater_than_or_equal_to: 0,
    less_than_or_equal_to: 50
  }
)
class Invite < ActiveRecord::Base
  belongs_to :eclub
  validate :check_invite_count!, on: :create

  private

  def check_invite_count!
    return if eclub.nil?
    if eclub.invites.count > 50
      errors.add(:base, 'Cannot add more than 50 invites for an Eclub')
    end
  end
end