Ruby on rails 有至少两个条目的\u many
我需要一个至少有两个条目的多个关联,如何编写验证,如何使用RSpec+factory girl进行测试?这是我到目前为止得到的,但是它失败了,因为Ruby on rails 有至少两个条目的\u many,ruby-on-rails,ruby,rspec,factory-bot,Ruby On Rails,Ruby,Rspec,Factory Bot,我需要一个至少有两个条目的多个关联,如何编写验证,如何使用RSpec+factory girl进行测试?这是我到目前为止得到的,但是它失败了,因为ActiveRecord::RecordInvalid:Validation failed:bar不能是空的,我完全被RSpec测试卡住了 /example\u app/app/models/foo.rb class Foo < ActiveRecord::Base has_many :bars validates :bars, :pre
ActiveRecord::RecordInvalid:Validation failed:bar不能是空的
,我完全被RSpec测试卡住了
/example\u app/app/models/foo.rb
class Foo < ActiveRecord::Base
has_many :bars
validates :bars, :presence => true, :length => { :minimum => 2}
end
class Bar < ActiveRecord::Base
belongs_to :foo
validates :bar, :presence => true
end
FactoryGirl.define do
factory :foo do
after(:create) do |foo|
FactoryGirl.create_list(:bar, 2, foo: foo)
end
end
end
FactoryGirl.define do
factory :bar do
foo
end
end
/example app/spec/factories/bar.rb
class Foo < ActiveRecord::Base
has_many :bars
validates :bars, :presence => true, :length => { :minimum => 2}
end
class Bar < ActiveRecord::Base
belongs_to :foo
validates :bar, :presence => true
end
FactoryGirl.define do
factory :foo do
after(:create) do |foo|
FactoryGirl.create_list(:bar, 2, foo: foo)
end
end
end
FactoryGirl.define do
factory :bar do
foo
end
end
您想使用自定义验证器
class Foo < ActiveRecord::Base
has_many :bars
validate :validates_number_of_bars
private
def validates_number_of_bars
if bars.size < 2
errors[:base] << "Need at least 2 bars"
end
end
end
class Foo类Foo2)
结束
结束
它“应该验证存在的酒吧”做什么
FactoryGirl.build(:foo,:bar=>[])。应至少包含(1)个。\u(:bar)上出现错误
结束
它“应该验证至少有两个条”这样做
foo=FactoryGirl.build(:foo)
foo.bar.push FactoryGirl.build(:bar,:foo=>nil)
foo.应该至少有(1)个错误(:bar)
结束
:length
用于字符串,而不是关系。这很好,但我不会命名方法条数,因为这不是它计算的。更好的命名方法是验证\u条的\u编号\u
或让它实际返回编号,然后编写一个验证规则将其视为属性。当然,这只是一个示例没有理由说明一个技术示例不能同时也是一个好的样式示例。对于通过关联进行销毁,您需要这样做:if bar.选择{bar |!bar.marked|u for_destruction?}.size<2错误。添加(:bar,:too_short,:count=>2)end确实如此,我们的代码还检查“destructed?”属性`bar|count=bar.reject{bar | bar.destructed?| bar.marked|u for|destruction?}.size