代码之家  ›  专栏  ›  技术社区  ›  Neil Middleton

轨道3中的左侧外部连接

  •  85
  • Neil Middleton  · 技术社区  · 15 年前

    我有以下代码:

    @posts = Post.joins(:user).joins(:blog).select
    

    但是,用户是可选的,这意味着 INNER JOIN 那个 :joins 没有返回很多记录。

    如何使用它生成 LEFT OUTER JOIN 相反呢?

    8 回复  |  直到 12 年前
        1
  •  112
  •   John Naegle    11 年前
    @posts = Post.joins("LEFT OUTER JOIN users ON users.id = posts.user_id").
                  joins(:blog).select
    
        2
  •  75
  •   WuTangTan    9 年前

    你可以用这个 includes as documented in the Rails guide :

    Post.includes(:comments).where(comments: {visible: true})
    

    结果:

    SELECT "posts"."id" AS t0_r0, ...
           "comments"."updated_at" AS t1_r5
    FROM "posts" LEFT OUTER JOIN "comments" ON "comments"."post_id" = "posts"."id"
    WHERE (comments.visible = 1)
    
        3
  •  11
  •   plainjimbo    12 年前

    我是这部电影的忠实粉丝 squeel gem

    Post.joins{user.outer}.joins{blog}
    

    它既支持 inner outer 连接,以及为多态关系指定类/类型的能力。

        4
  •  10
  •   K M Rakibul Islam    10 年前

    使用 eager_load

    @posts = Post.eager_load(:user)
    
        5
  •  8
  •   Jonathan Allard    13 年前

    默认情况下,通过时 ActiveRecord::Base#joins

    the documentation :

    :joins -一个SQL片段,用于其他连接,如“ LEFT JOIN comments ON comments.post_id = id 以相同的形式用于 :include 关联表上的内部联接,或包含 字符串和命名关联的混合。

    如果值是 字符串,则记录将以只读方式返回,因为它们将 具有与表列不对应的属性。通过 :readonly => false 覆盖。

        6
  •  7
  •   Ahmad Hussain    9 年前

    有一个 left_outer_joins 方法。你可以这样使用它:

    @posts = Post.left_outer_joins(:user).joins(:blog).select
    
        7
  •  4
  •   Diego Plentz    9 年前

    LEFT OUTER JOIN . 您的查询现在看起来像:

    @posts = Post.left_outer_joins(:user, :blog)
    
        8
  •  0
  •   lurker    11 年前
    class User < ActiveRecord::Base
         has_many :friends, :foreign_key=>"u_from",:class_name=>"Friend"
    end
    
    class Friend < ActiveRecord::Base
         belongs_to :user
    end
    
    
    friends = user.friends.where(:u_req_status=>2).joins("LEFT OUTER JOIN users ON users.u_id = friends.u_to").select("friend_id,u_from,u_to,u_first_name,u_last_name,u_email,u_fbid,u_twtid,u_picture_url,u_quote")