Ruby on rails 访问ActiveRecord::Associations::CollectionProxy中的属性

Ruby on rails 访问ActiveRecord::Associations::CollectionProxy中的属性,ruby-on-rails,ruby,activerecord,ruby-on-rails-4,rspec,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, ima

我正在尝试编写一个自定义函数,如果关联对象的数量
>=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">
]
这样就可以通过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
上面的代码被抛出控制台

这是我的工厂

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
我可能会用最倒退的方式来做这件事,有人有什么建议吗

谢谢

我正在尝试编写一个自定义函数,如果关联对象的数量>=4,该函数将抛出一个错误

你把事情搞得太复杂了。如果您只想计算集合中的记录数,那么只需执行animal.animal\u 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
class Animal=4,则添加(:base,“最多允许3张图像”)
结束
结束

谢谢,所以在动物模型而不是动物图像模型中进行验证…@richleis这取决于您在应用程序中所做的操作。在您的代码中,您正在测试animal.errors[:base],因此在动物模型中对其进行了验证,但您可以采用任何一种方法。必须相应地更新代码
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
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