验证Ruby on Rails中has_many项的数量

58 validation tagging ruby-on-rails has-many

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

class Snippet < ActiveRecord::Base

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

end
Run Code Online (Sandbox Code Playgroud)

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

Nik*_*bak 65

您始终可以创建自定义验证.

就像是

  validate :validate_tags

  def validate_tags
    errors.add(:tags, "too much") if tags.size > 5
  end
Run Code Online (Sandbox Code Playgroud)

  • 如果你使用tags.size,它会做"正确"的事情.请参阅http://blog.hasmanythrough.com/2008/2/27/count-length-size (28认同)
  • 我可能会使用`tags.count`以便数据库完成工作,并且您不会仅为此验证加载所有标记. (12认同)
  • @Beerlington:事实上似乎Nikita是对的,你不想打数据库进行验证,你要检查对象的"标签"的实际长度. (7认同)
  • 我认为这不是线程安全的-是吗?如果两个工作人员尝试插入标签会怎样? (2认同)

sbo*_*ami 59

@SooDesuNe此SO帖子上提供了更好的解决方案

validates :tags, length: { minimum: 1, maximum: 6 }
Run Code Online (Sandbox Code Playgroud)

  • FWIW,为此的默认错误消息是“太长(最多100个字符)” (3认同)
  • 如果要添加自定义错误消息:validates:tags,length:{minimum:1,message:"是必需的.请至少添加一个." } (2认同)
  • 验证消息的更好方法是覆盖区域设置中该模型属性的“too_long”验证消息(例如“en.activerecord.errors.models.user.attributes.tags.too_long”),这样您就不必在模型本身中手动处理翻译。 (2认同)

asu*_*aaa 7

我认为你可以使用验证.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
Run Code Online (Sandbox Code Playgroud)

或这个.

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
Run Code Online (Sandbox Code Playgroud)

然后,你可以命令.

@user.assign_attributes(params[:user])
@user.valid?
Run Code Online (Sandbox Code Playgroud)

谢谢你的阅读.

参考文献:

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