Ruby on rails 如何验证rails中是否包含数组内容

Ruby on rails 如何验证rails中是否包含数组内容,ruby-on-rails,arrays,validation,Ruby On Rails,Arrays,Validation,嗨,我的模型中有一个数组列: t.text :sphare, array: true, default: [] 我想验证它是否只包括列表中的元素(“好”、“坏”、“中性”) 我的第一次尝试是: validates_inclusion_of :sphare, in: [ ["Good"], ["Bad"], ["Neutral"] ] 但是,当我想在sphare ex中创建具有多个值的对象时([“Good”,“Bad”],验证器将其剪切为[“Good”] 我的问题是: 如何编写只检查所传递数

嗨,我的模型中有一个数组列:

t.text :sphare, array: true, default: []
我想验证它是否只包括列表中的元素(“好”、“坏”、“中性”)

我的第一次尝试是:

 validates_inclusion_of :sphare, in: [ ["Good"], ["Bad"], ["Neutral"] ]
但是,当我想在sphare ex中创建具有多个值的对象时([“Good”,“Bad”],验证器将其剪切为[“Good”]

我的问题是:

如何编写只检查所传递数组的值的验证,而不将其与修复示例进行比较

编辑my FactoryGirl的新增部分并测试失败:

我工厂女孩的一部分:

sphare ["Good", "Bad"]
以及我的rspec测试:

  it "is not valid with wrong sphare" do
    expect(build(:skill, sphare: ["Alibaba"])).to_not be_valid
  end
 it "is valid with proper sphare" do
    proper_sphare = ["Good", "Bad", "Neutral"]
    expect(build(:skill, sphare: [proper_sphare.sample])).to be_valid
  end  
这样做:

validates :sphare, inclusion: { in: ["Good", "Bad", "Neutral"] }
或者,您可以使用创建字符串数组的简短形式:
%w(好-坏中性)

有关包含的更多用法和示例,请参见

更新 由于Rails内置验证器不符合您的要求,您可以在模型中添加自定义验证器,如下所示:

validate :correct_sphare_types

private

def correct_sphare_types
  if self.sphare.blank?
    errors.add(:sphare, "sphare is blank/invalid")
  elsif self.sphare.detect { |s| !(%w(Good Bad Neutral).include? s) }
    errors.add(:sphare, "sphare is invalid")
  end
end

您可以实现自己的
ArrayInclusionValidator

# app/validators/array_inclusion_validator.rb
class ArrayInclusionValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    # your code here

    record.errors.add(attribute, "#{attribute_name} is not included in the list")
  end
end
#app/validators/array_inclusion_validator.rb
类ArrayInclusionValidator
在模型中,它如下所示:

# app/models/model.rb
class YourModel < ApplicationRecord
  ALLOWED_TYPES = %w[one two three]
  validates :type_of_anything, array_inclusion: { in: ALLOWED_TYPES }
end
#app/models/model.rb
类YourModel
示例如下:


尝试
验证:sphare的包含性,在:[“好”、“坏”、“中性”]
@Pavan-它不起作用。不起作用。我得到错误sphare不在列表中:(如何:
验证:sphare的包含性,在:%w(好-坏中性)
?我认为问题是它没有将值嵌套在数组中,所以它看起来是“好的”它应该在哪里寻找[“好”]好的,在这种情况下,您可以使用自定义验证器。我将很快使用自定义验证器代码更新我的答案。请使用自定义验证尝试我的更新代码。它假设,您的sphare数组只能有
好-坏中性
,如果它有任何超出这3个值的内容,那么它将是无效的sphare,并且不会被保存。让我告诉您知道这个假设是否正确。
# app/models/model.rb
class YourModel < ApplicationRecord
  ALLOWED_TYPES = %w[one two three]
  validates :type_of_anything, array_inclusion: { in: ALLOWED_TYPES }
end