I need to connect to a legacy SQL Server 2000 database using their own conventions and specially CamelCase columns and Tables.
For tables it seems fine, Rails is asking it with lowercase and the database find it nicely. The issue is with the columns because Rails fetch their name with SQL and thus get whatever case their name is.
I’m dealing with 500+ tables with some dozen columns in each of them and several legacy applications running in production above them so renaming the columns is no solution.
Using alias_attribute is also a way-too-much-work solution.
I don’t want to have some weird case in my code too like client.AccountId (just looks like Java code).
So my final question is: is there any way to have Rails dealing with lowercase methods and symbols which are then used in whatever-case the database uses when dealing with SQL ?
I’m looking for any existing solution or even a direction to the sensible area of ActiveRecord where all this mechanics is done (I’ve been searching but the source code is huge …)
OKay some time after posting the question I had a flash idea that alias_attribute was actually the solution but just needed a bit of magic over it.
Here is the solution to my own problem:
I think this is the minimum code modification possible to avoid messing all ActiveRecord code. I’d like your opinion on this and your comments if you see a wall I’m going to hit and I don’t !
To describe the solution, I’m using the columns method of ActiveRecord to generate snake_case looking aliases for each column. I’m also giving alias_column a memory of the aliases, that way read and write attribute methods know when they are dealing with alias names.
Since in my legacy database the convention for the ID or the table Table is TableID, my solution will create a table_id alias found by ActiveRecord using the “table_name_with_underscore” convention, so the id method is working as expected.
I presume it’s not going to work with all the SQL fetches, even with Squeel of something but I don’t think there is any simple solution for this.