Ruby Enumerators
I have a rails app that handles a lot of information about a set of experimental plates. Along with holding information about each plate, I have another table locations, that’s nested with the plates, as in plates has_many locations and locations belongs_to plates. The locations is a separate table because these plates can get shipped to different locations a lot. This is a way for us to track where all the plates are. Most importantly, we want to know which location for a give plate has the latest date, because this will tell us where the plate currently is.
For the most part, there are only a limited number of places where the plate will be. We have a list in the model. On our main page, I wanted to have a link to each of the main places showing which plates are at that location. Here’s how I did it:
In my controller
def plates_at_uc
@all = Plate.by_serial_number
@title = 'UC'
@plates = Enumerator.new do |y|
@all.map do |plate|
unless(plate.locations.empty?)
if (plate.locations.current_location.last.location == 'UC')
y << plate
end
end
end
end
render action: "plates_by_location"
end
I have a method for each of the locations where the plates could be. The important bit here is the enumerator that I set up. This sets up the instance variable with all the plates that I’m going to display in the view. I have to go through each plate and find its present location. If that location equals the one I want (in this case UC), I add the plate to my enumerator. I set up @title so that I can use the same view for the results and display the location in the title of the page.