IveMadeAHugeMistake
IveMadeAHugeMistake

Reputation: 134

Rails ActiveRecord has_many through association query

When I query directly against my database I get the expected result, but not in rails. I'm guessing it has to do with my associations and something bad I said about Ruby 3 years ago.

Postgres SQL Query:

SELECT users.email, members.software, members.files 
FROM users INNER JOIN members 
ON members.user_id = users.id 
WHERE members.region_id=2

Result: "[email protected]";t;t "[email protected]";t;t

BUT from rails c:

>   ←[1m←[36mUser Load (1.0ms)←[0m  ←[1mSELECT users.email,
> members.software, members.files FROM "users" INNER JOIN "members" ON
> "members"."user_id" = "users"."id" WHERE "members"."region_id" =
> 2←[0m> => #<ActiveRecord::Relation [#<User id: nil, email: "[email protected]">, #<User id:  nil, email: "[email protected]">]>

That snippet was the resulting query from pasting in what I have tried to create in my controller and hard coding the region id:

User.joins(:members).select("users.email, members.software, members.files").where(members: {region_id: params[:id]})

These are my models:

class User < ActiveRecord::Base
      has_many :members
      has_many :regions, :through => :members
end

class Region < ActiveRecord::Base
  has_many :members
  has_many :users, :through => :members

end

class Member < ActiveRecord::Base
  belongs_to :user
  belongs_to :region
end

Is it the way I have associated my models or something else that I am missing?

Thanks!

Upvotes: 0

Views: 4100

Answers (1)

usha
usha

Reputation: 29369

What you are getting is active_relations object.

you can access the attributes like this

users = User.joins(:members).select("users.email, members.software as software, members.files as files").where(members: {region_id: params[:id]})

users.each do |u|
  p u.email
  p u.software
  p u.files
end

Upvotes: 2

Related Questions