Search code examples
ruby-on-railsmodelsransack

Search for all students in different classes from school view


I have this structure of models:

City has_many School has_many Sclasses has_many Users

What I want to do is to search for all users in current school from school#show view. In the past, I had this to search for them:

@search = @school.users.ransack(params[:q])

Now, position of User model has been changed and I don't know how to do that properly. I want to do next:

def show
  find_city
  find_school

  # search variable for all users in this school

  if (params.has_key?(:q))
    # search for all users in this school
  else
    # show all classes of this school
    @sclasses = @school.sclasses.all
  end
end

School model

class School < ActiveRecord::Base
  belongs_to :city
  has_many :sclasses

  validates :name, presence: true
  validates :icon_url, length: { maximum: 100 }
end

Sclass model

class Sclass < ActiveRecord::Base
  belongs_to :school
  has_many :users

  validates :name, presence: true, numericality: { only_integer: true }
  validates :icon_url, length: { maximum: 100 }
end

routes.rb

  ...

  get "/gradovi" => "welcome#index", as: "cities"
  get "/gradovi/novi" =>  "cities#new", as: "new_city"
  post "/gradovi" => "cities#create"
  get "/gradovi/:id" => "cities#show", as: "city"
  get "/gradovi/:id/uredi" => "cities#edit", as: "edit_city"
  patch "/gradovi/:id" => "cities#update"

  get "/gradovi/:city_id" => "schools#index", as: "schools"
  get "/gradovi/:city_id/nova-skola" => "schools#new", as: "new_school"
  post "/gradovi/:city_id/" => "schools#create"
  get "/gradovi/:city_id/skola/:id" => "schools#show", as: "school"
  get "/gradovi/:city_id/skola/:id/uredi" => "schools#edit", as: "edit_school"
  patch "/gradovi/:city_id/skola/:id" => "schools#update"

  get "/gradovi/:city_id/skola/:school_id" => "sclasses#index", as: "sclasses"
  post "/gradovi/:city_id/skola/:school_id" => "sclasses#create"
  get "/gradovi/:city_id/skola/:school_id/razred/dodaj" => "sclasses#new", as: "new_sclass"
  get "/gradovi/:city_id/skola/:school_id/razred/:id" => "sclasses#show", as: "sclass"
  get "/gradovi/:city_id/skola/:school_id/razred/:id/uredi" => "sclasses#edit", as: "edit_sclass"
  patch "/gradovi/:city_id/skola/:school_id/razred/:id" => "sclasses#update"

  get "/gradovi/:city_id/skola/:school_id/razred/:sclass_id" => "users#index", as: "users"
  post "/gradovi/:city_id/skola/:school_id/razred/:sclass_id" => "users#create"
  get "/gradovi/:city_id/skola/:school_id/razred/:sclass_id/ucenik/:id" => "users#show", as: "user"
  get "/gradovi/:city_id/skola/:school_id/razred/:sclass_id/ucenik/:id/uredi" => "users#edit", as: "edit_user"
  patch "/gradovi/:city_id/skola/:school_id/razred/:sclass_id/ucenik/:id" => "users#update"
  delete "/gradovi/:city_id/skola/:school_id/razred/:sclass_id/ucenik/:id" => "users#destroy"

  resources :city

end

Solution

  • Having the @school variable, here is how you can get a list of all users associated with the school:

    User.joins(sclass: :school).where(schools: { id: @school.id })
    

    Alternatively, you can simply define an association:

    class School < ActiveRecord::Base
      has_many :users, through: :sclasses
    end
    

    Now, in the view simply:

    @school.users