All posts

Accessing data from a join query in Rails

To understand the join example that follows I posted the classes that are referenced and their associations below where a User has many Form‘s and a Form has many FormFields.

class User < ApplicationRecord
  has_many :forms
class Form < ApplicationRecord
  belongs_to :user
  has_many :form_fields
class FormField < ApplicationRecord
  belongs_to :form

When querying your database while using rails, if there exists a foreign key relationship on the model you’re working on you can run the join query you can perform an inner join by calling the .join method on the model in the following way:

@user =  User.joins(forms: :form_fields).find(params[:user_id])

The below query results in the following SQL statement where there are two joins performed, the first on the form and then another query for the forms fields:

SELECT "users".* FROM "users" 
INNER JOIN "forms" ON "forms"."user_id" = "users"."id" 
INNER JOIN "form_fields" ON "form_fields"."form_id" = "forms"."id" WHERE "users"."id" = $1

To access the data you can use the accessors provided by rails and no new query will be called when you ask for form on the @user object or form_fields on the @form object

=> #<Form:0x000000013e579240
@form = @user.form[1]
=> #<FormField:0x000000013e5793a8