TenzingS
TenzingS

Reputation: 63

Iterating through an array inside object inside array in Rails

I'm trying to iterate through an array inside an object inside an array and get all teachers where the subjects match. Here is the nested array Teacher:

teachers: [
    {name: "Dave", subjects: ["english", "math"]},
    {name: "Jamal", subjects: ["history", "science"]},
    {name: "Brian", subjects: ["science", "gym"]},
    {name: "Sally", subjects: ["math", "history"]}
]

And this is the subjects array:

subjects: ["english", "gym"]

I want to be able to get all teachers that have the subjects "english" and "gym". So basically need to get back an output of:

teachers: [
    {name: "Dave", subjects: ["english", "math"]}, 
    {name: "Brian", subjects: ["science", "gym"]}
]

This is what I've come up with so far but this only renders the first object that contains "english" which is Dave. I realize and return makes it so that it exits the loop but I had to add and return otherwise it would be a doublerender error. The answer is prob a completely different way so any method would be appreciated!

subjects.each do |subject|
        Teacher.all.each do |teach|
          if (teach.subjects).include?(subject) then
            render json: teach and return
          end         
        end
end
teachers: [
    {name: "Dave", subjects: ["english", "math"]}
]

How would I be able to keep the loop going to get back Brian as well?

Upvotes: 0

Views: 263

Answers (1)

David Aldridge
David Aldridge

Reputation: 52336

It sounds like you're looking for any teachers who teach any of the subjects in the subjects array, so:

teachers = [
    {name: "Dave", subjects: ["english", "math"]},
    {name: "Jamal", subjects: ["history", "science"]},
    {name: "Brian", subjects: ["science", "gym"]},
    {name: "Sally", subjects: ["math", "history"]}
]

subjects = ["english", "gym"]

teachers.select do |teacher|
  (subjects & teacher[:subjects]).size > 0
end

The ampersane operator is an intersection between the elements of arrays - the values that are in both, in other words.

Upvotes: 2

Related Questions