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 …)
======
class Role < ActiveRecord::Base
has_and_belongs_to_many :profiles, :join_table => :profiles_roles
On 16 January 2012 15:54, Erwin [email protected] wrote:
which gives me all roles attributes only
AS …)
======
class Role < ActiveRecord::Base
has_and_belongs_to_many :profiles, :join_table => :profiles_roles
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
On 16 ene, 16:54, Erwin [email protected] wrote:
which gives me all roles attributes only
AS …)
======
class Role < ActiveRecord::Base
has_and_belongs_to_many :profiles, :join_table => :profiles_roles
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