访问ActiveRecord :: Associations :: CollectionProxy中的属性

时间:2014-10-15 14:21:19

标签: ruby-on-rails ruby activerecord ruby-on-rails-4 rspec

我正在尝试编写一个自定义函数,如果相关对象的数量为>=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

我可能会以最落后的方式解决这个问题,有没有人有任何建议

感谢

1 个答案:

答案 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