Earlier I posted a list of all US zipcodes by city and state. I needed it for one of my sites and now I’m finding it handy for another. Instead of having people fill City, State, and Zip individually (with a high probability that the data won’t be standardized enough to do comparisons between records), you can simply accept a zip code from them and populate the rest yourself.
I create a Zip model that has the following three fields: `code, city, state`. I import the data into it like so (dependant on mysql):
class CreateZips < ActiveRecord::Migration
def self.up
create_table :zips do |t|
t.column :city, :string
t.column :state, :string
end
# load the zipcodes from a csv file
execute "load data infile '#{RAILS_ROOT}/db/migrate/zips.csv' into table zips fields terminated by ',' lines terminated by '\n'"
end
def self.down
drop_table :zips
end
end
And I make sure my zips.csv file can be found in the ./db/migrate folder.
To associate this model with others, just add a `belongs_to :zip` and make sure that you’ve got a `zip_id` in the table schema. If you use the above migration the zipcode will be set as the table id and you can manually set zip_id to whatever zip code you want – handy for writing fixtures!
Now in my forms I only need to have a 5-char field that asks for a zipcode and (using lovely, lovely AJAX) displays the corresponding city and state automatically.