2011-07-29 6 views
0

@posts 행은 정확히 무엇을합니까?ruby ​​on rails :이 SQL 쿼리는 어떻게 작동합니까?

def index 
    if params[:user_id] && params[:artist_id] 
     @id = params[:user_id] 
     @name = Artist.find(params[:artist_id]).name 
     @posts = Post.includes(:user).where('users.id' => @id).joins(:artists).where('artists.name' => @name) 
    end 
end 

이 정말 긴 검색어를 제공하는 것 같습니다. 모든 이유가 왜 필요한지 혼란 스럽습니다.

감사

Started GET "https://stackoverflow.com/users/example4/artists/22/posts" for 127.0.0.1 at 2011-07-29 16:34:48 -0700 
     Processing by PostsController#index as HTML 
     Parameters: {"user_id"=>"example4", "artist_id"=>"22"} 
     Artist Load (0.2ms) SELECT "artists".* FROM "artists" WHERE "artists"."id" = 22 LIMIT 1 
     Post Load (0.5ms) SELECT "posts"."id" AS t0_r0, "posts"."title" AS t0_r1, "posts"."content" AS t0_r2, "posts"."user_id" AS t0_r3, "posts"."created_at" AS t0_r4, "posts"."updated_at" AS t0_r5, "posts"."item_name" AS t0_r6, "posts"."a_name" AS t0_r7, "posts"."image" AS t0_r8, 
"posts"."collection_id" AS t0_r09, "posts"."featured_post" AS t0_r10, "users"."id" AS t1_r0, 
"users"."email" AS t1_r1, "users"."encrypted_password" AS t1_r2, "users"."reset_password_token" AS 
t1_r3, "users"."remember_token" AS t1_r4, "users"."remember_created_at" AS t1_r5, 
"users"."sign_in_count" AS t1_r6, "users"."current_sign_in_at" AS t1_r7, "users"."last_sign_in_at" 
AS t1_r8, "users"."current_sign_in_ip" AS t1_r9, "users"."last_sign_in_ip" AS t1_r10, 
"users"."created_at" AS t1_r11, "users"."updated_at" AS t1_r12, "users"."name" AS t1_r13, 
"users"."username" AS t1_r14, "users"."bio" AS t1_r15, "users"."avatar" AS t1_r16, 
"users"."cached_slug" AS t1_r17, "users"."bg_image" AS t1_r18, "users"."bg_tile" AS t1_r19 FROM 
"posts" INNER JOIN "artisanships" ON "posts"."id" = "artisanships"."post_id" INNER JOIN "artists" 
ON "artists"."id" = "artisanships"."artist_id" LEFT OUTER JOIN "users" ON "users"."id" = 
"posts"."user_id" WHERE "users"."id" = 0 AND "artists"."name" = 'bobby' ORDER BY posts.created_at 
DESC 
     User Load (1.6ms) SELECT "users".* FROM "users" WHERE "users"."id" = 7 LIMIT 1 
    Rendered posts/artists.html.erb within layouts/application (275.3ms) 
    Completed 200 OK in 481ms (Views: 316.4ms | ActiveRecord: 3.4ms) 

답변

0

난 당신이 아직하지 않은 경우 AR querying guide를 읽고 권하고 싶습니다.

붙여 넣은 코드는 컨트롤러에서 가져온 코드이므로 여러 가지를 요구합니다. 그래서 여러 개의 쿼리가 발생합니다.

이 줄 :

@name = Artist.find(params[:artist_id]).name 

는 예술가 테이블을 조회하고이 라인 동안 결과에서

를 name 속성을 받고있다 :

@posts = Post.includes(:user).where('users.id' => @id).joins(:artists).where('artists.name' => @name) 

는 .includes과 모두 있습니다. 조인 ... 모든 쿼리가 필요한 이유입니다. 테이블에 적절한 색인이 생성되어 있으면 문제가되지 않습니다.

+0

열망 로딩이 실제로 요구에 의해 억제되는 조인입니다 그래서 ActiveRecord는 조인을 대신합니다. –

0

eager loading이라는 방법을 사용하고 있습니다. 그것이 포함하는 것입니다. 이 의미

@posts.first.user 

레일은 3 개 쿼리를 작성하고 메모리에 포스트로드를위한 모든 사용자를 호출 다시 쿼리를 수행 할 때 대신합니다. 당신이 조인

@posts.each do |post| 
    pusts post.user 

처럼 뭔가를 할 때 쿼리 횟수를 줄일 그 방법은 SQL과 같은이 사용자의 테이블에 WHERE을 할