# How to validate that array contains instances of ActiveRecord class?

**URL:** <https://discourse.dry-rb.org/t/how-to-validate-that-array-contains-instances-of-activerecord-class/1094>\
**Category:** dry-validation\
**Created:** [July 28, 2020, 12:53am UTC](https://discourse.dry-rb.org/t/how-to-validate-that-array-contains-instances-of-activerecord-class/1094 "2020-07-28T00:53:26Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![kelvinlzhang](https://avatars.discourse-cdn.com/v4/letter/k/71c47a/32.png) [@kelvinlzhang](https://discourse.dry-rb.org/u/kelvinlzhang)\
**Post date:** [July 28, 2020, 12:53am UTC](https://discourse.dry-rb.org/t/how-to-validate-that-array-contains-instances-of-activerecord-class/1094/1 "2020-07-28T00:53:26Z")

</div>

For keys of a single value something like `required(:user).value(type?: User)` works great, but what if `users` is an array? I’ve tried `required(:users).each(type?: User)` and it’s equivalent block syntax to try and mimic the pattern on the docs (`required(:ids).each(:int?)`) but that results in:

`NoMethodError: undefined method 'map' for nil:NilClass` at the contract call site.

I’m sure I’m missing something obvious but I can’t seem to figure it out.

---

<div class="post-metadata">

**Author:** ![solnic](https://yyz1.discourse-cdn.com/flex031/user_avatar/discourse.dry-rb.org/solnic/32/779_2.png) [@solnic](https://discourse.dry-rb.org/u/solnic)\
**Post date:** [July 29, 2020, 6:19am UTC](https://discourse.dry-rb.org/t/how-to-validate-that-array-contains-instances-of-activerecord-class/1094/2 "2020-07-29T06:19:44Z")

</div>

This should work:

```ruby
dry-validation> c=contract { schema { required(:strings).value(:array?).each(type?: String) } }
=> #<#<Class:0x00007f877b908be8> schema=#<Dry::Schema::Processor keys=[:strings] rules={:strings=>"key?(:strings) AND key[strings](array? AND each(type?(String)))"}> rules=[]>
dry-validation> c.(strings: ["foo", :bar]).errors.to_h
=> {:strings=>{1=>["must be String"]}}

```

…but I don’t recommend writing contracts that check if values are AR objects. dry-validation/schema are meant to be used to validate data structures. Checking types like that is against duck typing.
