簡體   English   中英

Ruby on Rails:此SQL查詢如何正常工作?

[英]ruby on rails: how does this sql query work exactly?

@posts行到底做什么?

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 "/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)

如果您還沒有的話,建議您閱讀AR查詢指南

您粘貼的代碼來自控制器-在該操作中,您需要進行多種操作。 這就是為什么要進行多個查詢的原因。

這行:

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

正在查詢Artists表並從結果中獲取name屬性

而這行:

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

同時具有.includes和.joins ...這就是為什么需要所有查詢的原因。 只要您在表中創建了正確的索引,就不成問題。

它使用一種稱為“緊急加載”的方法。 那就是includes所做的。

這意味着什么,而不是什么時候做

@posts.first.user

Rails再次查詢時,它將編寫3個查詢,並為所有用戶調用該帖子並將其加載到內存中。 這樣,當您執行類似操作時,您可以減少查詢數量

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

聯接與SQL聯接相同

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM