2016-11-17 2 views
0

У меня есть эта структура моделей:поиск для всех студентов в различных классах с точки зрения школы

City has_many School has_many Sclasses has_many Users 

То, что я хочу сделать, это поиск для всех пользователей в текущей школе из школы # показать вид. В прошлом у меня был это искать их:

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

Теперь положение пользователя модели было изменено, и я не знаю, как сделать это правильно. Я хочу сделать следующий:

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 

Школа модель

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

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

Sclass модель

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 

ответ

2

Имея переменную @school, вот как вы можете получить список всех пользователей, связанных со школой:

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

В качестве альтернативы, вы можете просто определить ассоциацию:

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

Теперь, в представлении просто:

@school.users 
+1

@Nikola уверен, 'has_many: пользователи через:: sclasses' - это еще одна строка, к которой вы уже h ave в определении класса 'School', поэтому вы все равно можете использовать' @ school.sclasses' :) –