我正在尝试编写一个自定义函数,如果相关对象的数量为>=4
我想知道如何访问包含哈希中的键/值并对其进行验证
如果我这样做
animal = FactoryGirl.create(:animal, images_count: 4)
a = animal.animal_images
ap(a)
我得到了这个
#<ActiveRecord::Associations::CollectionProxy [
#<AnimalImage id: 520, animal_id: 158, image: "yp2.jpg", created_at: "2014-10-15 13:45:11", updated_at: "2014-10-15 13:45:11">,
#<AnimalImage id: 521, animal_id: 158, image: "yp2.jpg", created_at: "2014-10-15 13:45:11", updated_at: "2014-10-15 13:45:11">,
#<AnimalImage id: 522, animal_id: 158, image: "yp2.jpg", created_at: "2014-10-15 13:45:11", updated_at: "2014-10-15 13:45:11">,
#<AnimalImage id: 523, animal_id: 158, image: "yp2.jpg", created_at: "2014-10-15 13:45:11", updated_at: "2014-10-15 13:45:11">
]
所以我想到了使用.map
animal = FactoryGirl.create(:animal, images_count: 4)
a = animal.animal_images
map = a.each.map { |i| i.image }
if map.length >= 4
ap('MORE THAN 4 IMAGES')
end
"MORE THAN 4 IMAGES"
这样就可以遍历CollectionProxy。但是,如何将其格式化为正确的rspec测试并在自定义验证函数中执行逻辑。
我认为我的测试看起来像这样
it 'should display an error message when too many images are uploaded' do
animal = FactoryGirl.create(:animal, images_count: 4)
animal.max_num_of_images
expect(animal.errors[:base]).to include("Max of 3 images allowed")
end
只是为了获得现在的传递(添加错误消息),没有逻辑我
class AnimalImage < ActiveRecord::Base
belongs_to :animal
validate :max_num_of_images, :if => "image?"
def max_num_of_images
errors.add(:base, "Max of 3 images allowed")
end
end
但似乎测试没有超过第一行
ActiveRecord::RecordInvalid:
Validation failed: Max of 3 images allowed
以上内容将在控制台中抛出
这是我的工厂
FactoryGirl.define do
factory :animal, class: Animal do
ignore do
images_count 0
end
after(:create) do |animal, evaluator|
create_list(:animal_image, evaluator.images_count, animal: animal)
end
end
end
FactoryGirl.define do
factory :animal_image do
image { File.open("#{Rails.root}/spec/fixtures/yp2.jpg") }
end
end
我可能会以最落后的方式解决这个问题,有没有人有任何建议
感谢
答案 0 :(得分:1)
我正在尝试编写一个自定义函数,如果关联对象的数量为&gt; = 4,则会抛出错误
你太复杂了。 如果您只想计算集合中的记录数,那么您只需执行 animal.animal_images.size 即可。所以你的模型看起来像这样:
class Animal < ActiveRecord::Base
has_many :animal_images
validate :max_num_of_images
def max_num_of_images
errors.add(:base, "Max of 3 images allowed") if self.animal_images.size >= 4
end
end