验证Ruby on Rails中has_many项的数量

问题描述 投票:55回答:3

用户可以将标签添加到代码段:

class Snippet < ActiveRecord::Base

  # Relationships
  has_many :taggings
  has_many :tags, :through => :taggings
  belongs_to :closing_reason

end

我想验证标签的数量:至少为1,最多为6.我如何做到这一点?谢谢。

ruby-on-rails validation tagging has-many
3个回答
65
投票

你总是可以创建一个custom validation

就像是

  validate :validate_tags

  def validate_tags
    errors.add(:tags, "too much") if tags.size > 5
  end

56
投票

@SooDesuNethis SO post上提供了一个更好的解决方案

validates :tags, length: { minimum: 1, maximum: 6 }

6
投票

我想你可以使用.reject(&:marked_for_destruction?).length进行验证。

这个怎么样?

class User < ActiveRecord::Base
  has_many :groups do
    def length
      reject(&:marked_for_destruction?).length
    end
  end
  accepts_nested_attributes_for :groups, allow_destroy: true
  validates :groups, length: { maximum: 5 }
end

或这个。

class User < ActiveRecord::Base
  has_many :groups
  accepts_nested_attributes_for :groups, allow_destroy: true
  GROUPS_MAX_LENGTH = 5
  validate legth_of_groups

  def length_of_groups
    groups_length = 0
    if groups.exists?
      groups_length = groups.reject(&:marked_for_destruction?).length
    end
    errors.add(:groups, 'too many') if groups_length > GROUPS_MAX_LENGTH
  end
end

然后,你可以命令。

@user.assign_attributes(params[:user])
@user.valid?

谢谢你的阅读。

参考文献:

http://homeonrails.com/2012/10/validating-nested-associations-in-rails/ http://qiita.com/asukiaaa/items/4797ce44c3ba7bd7a51f

© www.soinside.com 2019 - 2024. All rights reserved.