This issue is slightly complex so here is a bit of background:
I'm developing a wrapper that allows you to easily integrate extjs with rails. At the moment i'm developing with the "grid widget".
The point of the widget is to allow the user a customizable sortable, filterable, paginated grid that works with relationships with the minimum of setup.
To set one of these grids up you follow the steps:
a) Setup a configuration yaml file which defines a "base model" to work with, followed by all the "columns" to be displayed in the grid using the relationship path from the base model to define where to fetch the data from.
employee_addresses: model: Person store: - gender - birthday - age - email - home_address.street_no - home_address.street_name - home_address.street_type - home_address.suburb.name - home_address.suburb.post_code - work_address.suburb.name
b) In the controller you simply perform a search applying security conditions etc, create a Grid object, and pass that to a view helper which sets up the html and javascript. (note at this stage, the named_filter filter does not do anything when first viewing, it only filters after filter conditions start coming in via xhr)
def myaction
people = Person.filter('employee_addresses', params[:filter]).find(:all, :include => [{:home_address => :suburb},{:work_address => :suburb}], :conditions => 'some_extra_security_stuff', :limit => 10) @grid = Grid.new(:name => 'employee_addresses', :collection => people) respond_to do |format| format.html { render :action => :grid_model_test } format.json do render :text => @grid.data.to_json end end end end
c) The user then using the js interface selects some filtering conditions and this gets passed via params into the controller in the form something like field_type: string field_name: home_address.suburb.name conditions: equal value: my_home_suburb
This then gets passed into the filter in which i have to construct the appropriate sql conditions.
The issue I have been struggling over is that I can not predict what the table name will be aliased by activerecord. I have to be able to convert 'home_address.suburb.name' into suburb.name. but in some cases it activerecord aliases that to suburbs_addresses.name.
From what I can tell, the first time the relationship is used it uses "suburbs" with no alias, then "suburbs_addresses". But in another field i've noticed that it's used the relationship name "home_addresses_people".
Here is an example of the generated sql: FROM `people` LEFT OUTER JOIN `addresses` ON `addresses`.id = `people`.work_address_id LEFT OUTER JOIN `suburbs` ON `suburbs`.id = `addresses`.suburb_id LEFT OUTER JOIN `addresses` home_addresses_people ON `home_addresses_people`.id = `people`.home_address_id LEFT OUTER JOIN `suburbs` suburbs_addresses ON `suburbs_addresses`.id = `home_addresses_people`.suburb_id WHERE (home_address.suburb.suburb like 'my_home_suburb')
Is there anyway I can make the aliasing of the tables predictable? .. i.e I know that it will always use a specific alias
One solution i have considered (although it's a little extreme, and might break apps using the plugin) is to force active record to alias all fields based on their relationships. i.e. suburbs would become home_address_suburb, work_address_suburb etc
Any help will be greatly appreciated as i've been struggling with this issue, i've already got a fully working solution that works without filtering