I think you can do this:
2.1.0 :001 > parent_array = [["red", "green", "blue"], ["small", "large", "medium"], ["loose", "tight"]]
=> [["red", "green", "blue"], ["small", "large", "medium"], ["loose", "tight"]]
2.1.0 :002 > first_array = parent_array.shift
=> ["red", "green", "blue"]
2.1.0 :003 > first_array
=> ["red", "green", "blue"]
2.1.0 :004 > parent_array
=> [["small", "large", "medium"], ["loose", "tight"]]
# Use the splat operator (*)
2.1.0 :006 > product = first_array.product(*parent_array)
=> [["red", "small", "loose"], ["red", "small", "tight"], ["red", "large", "loose"], ["red", "large", "tight"], ["red", "medium", "loose"], ["red", "medium", "tight"], ["green", "small", "loose"], ["green", "small", "tight"], ["green", "large", "loose"], ["green", "large", "tight"], ["green", "medium", "loose"], ["green", "medium", "tight"], ["blue", "small", "loose"], ["blue", "small", "tight"], ["blue", "large", "loose"], ["blue", "large", "tight"], ["blue", "medium", "loose"], ["blue", "medium", "tight"]]
2.1.0 :007 > result = product.map {|array| array.join(' ') }
=> ["red small loose", "red small tight", "red large loose", "red large tight", "red medium loose", "red medium tight", "green small loose", "green small tight", "green large loose", "green large tight", "green medium loose", "green medium tight", "blue small loose", "blue small tight", "blue large loose", "blue large tight", "blue medium loose", "blue medium tight"]
producton the first array and pass in the rest of the arrays individually.