how to select attributes on :join ?

when I use a quart joins on Roles and Profiles models

Role.joins(:profiles).where('profiles.profilable_type' => "Admin")

I get the following generated sql SELECT `roles`.* FROM `roles` INNER JOIN `profiles_roles` ON `profiles_roles`.`role_id` = `roles`.`id` INNER JOIN `profiles` ON `profiles`.`id` = `profiles_roles`.`profile_id` WHERE `profiles`.`profilable_type` = 'Admin'

which gives me all roles attributes only

I should I write my Rails query to get all attributes ?

SELECT `roles`.*, `profiles`.* FROM `roles` INNER JOIN `profiles_roles` ON `profiles_roles`.`role_id` = `roles`.`id` INNER JOIN `profiles` ON `profiles`.`id` = `profiles_roles`.`profile_id` WHERE `profiles`.`profilable_type` = 'Admin'

in this case, I'll have 2 attributes with same name in both tables ( :id and :name ) is there any way to avoid such collision ( using AS ...)

If you get the profiles using something like profiles = Profile.where( profileable_type => "Admin") then for each profile in the collection you can do profile.roles to get all the roles for that profile.

Alternatively use :includes( :profiles ) rather than join and specify a where for the the profilable type which will give you a collection of Roles.

Colin

If for some reason you need the results of the join, you can do:

Role.joins(:profiles).where('profiles.profilable_type' => "Admin").select('profiles.id, roles.id, profiles.name, profiles.id as p_id') # you can use the sql 'as' in the string

Keep in mind this will return an ActiveRecord::Relation instance, not a set of Role or Profile, so if your plan is to iterate through results, you better do it as Collin instructed