Lightweight string mappings engine for Rails
Provides models and a UI for creating and maintaining string pairs. A tiny DSL is included so developers to easily make use of the generated data. The UI allows system administrators to create groups of string pairs that can be maintained by non-technical people.
We use this tool to map account names in a legacy system, where we don't control the names, to their corresponding names in our in-house system.
Add it to your
Bundle it up
Install the migrations and apply them
rake mappable:install:migrations rake db:migrate
The migrations will add tables similar to this
create_table "mappable_mappings", :force => true do |t| t.integer "map_id" t.string "from" t.string "to" end create_table "mappable_maps", :force => true do |t| t.string "subject" t.string "attr" t.string "from" t.string "to" end
Mount the engine
mount Mappable::Engine => '/map'
You can use the included generator to copy the views if you'd like to customize them
rails generate mappable:views
If you want to override the views for
mappings that belong to a specific
map puts them in
app/views/mappable/[MAP_NAME]/mappings. This is most useful for overriding the mappings/_form partial. Often one side of the mapping is a controlled value that can be selected from a select box element, etc. You can generate these scoped views with:
rails generate mappable:views account_names
Mappings: String pairs that map to each other
Maps: A group of mappings and relevant metadata.
Given the following records
id = 1 subject = 'account' attr = 'name' from = 'legacy' to = 'current'
id = 1 map_id = 1 from = 'Old Account Name' to = 'New Account Name'
Now you can map strings in either direction using the following grammar
LegacyAccountName("Old Account Name").to_current #=> "New Account Name" CurrentAccountName("New Account Name").to_legacy #=> "Old Account Name"
Move rebuilding of maps to an initializer and/or add notes to readme about why Map.all gets called on every request in development Better indexing in migrations Add security features Deal with going from/to when there's more than one to with the same name