2017-10-27 1 views
0

Ich habe eine Tabelle User und Tabelle Post. Ein Benutzer kann viele Beiträge haben. Hier ist das Schema:ActiveRecord: Abfrage aller Datensätze, die keine Verknüpfungsdaten

User 
    user_id 
    user_name 
Post 
    post_id 
    post_content 
    user_id 

Ich möchte eine Abfrage haben, dass: Ruft alle Benutzer ohne Post. Ich kann das mit Raw Sql tun, aber ich weiß nicht, ob wir irgendwelche Möglichkeiten für ActiveRecord haben oder nicht. Wenn vorhanden, bitte sag mir wie.

Ich kann dies tun, basierend auf Marek Lipka Antwort:

User.includes(:posts).where(posts: { post_id: nil }) 

Das Ding jetzt, dass ich nicht verstehe, ist, dass die Abfrage erzeugt durch erklären aus Abfrage unterscheidet, die auf der Konsole ausgibt.

Hier Abfrage, die auf der Konsole ausgibt:

SELECT COUNT(DISTINCT "users"."id") FROM "users" LEFT OUTER JOIN "posts" ON "posts"."user_id" = "users"."id" WHERE "posts"."id" IS NULL 

Hier Abfrage Druck auf erklären. Es ist komplizierter, weil die Abfrage nicht alle auswählt, sondern Feld für Feld auswählt.

EXPLAIN for: SELECT "users"."id" AS t0_r0, "users"."email_address" AS t0_r1, "users"."first_name" AS t0_r2, "users"."last_name" AS t0_r3, "users"."full_name" AS t0_r4, "users"."avatar_url" AS t0_r5, "users"."profile_name" AS t0_r6, "users"."profile_base_name" AS t0_r7, "users"."profile_base_name_order" AS t0_r8, "users"."quote" AS t0_r9, "users"."user_register_phrase" AS t0_r10, "users"."total_followers" AS t0_r11, "users"."total_followings" AS t0_r12, "users"."token" AS t0_r13, "users"."jwt_token" AS t0_r14, "users"."active_state" AS t0_r15, "users"."role_id" AS t0_r16, "users"."created_at" AS t0_r17, "users"."updated_at" AS t0_r18, "posts"."id" AS t1_r0, "posts"."user_id" AS t1_r1, "posts"."post_type" AS t1_r2, "posts"."book_id" AS t1_r3, "posts"."title" AS t1_r4, "posts"."content" AS t1_r5, "posts"."total_upvotes" AS t1_r6, "posts"."total_downvotes" AS t1_r7, "posts"."total_views" AS t1_r8, "posts"."total_subscriptions" AS t1_r9, "posts"."accent_search" AS t1_r10, "posts"."created_at" AS t1_r11, "posts"."updated_at" AS t1_r12 FROM "users" LEFT OUTER JOIN "posts" ON "posts"."user_id" = "users"."id" WHERE "posts"."id" IS NULL 

Dank

Antwort

2

Es ist ein Weg, linke äußere auszuführen verbinden mit bestimmten Bedingung:

User.includes(:posts).where(posts: { post_id: nil }) 
+0

Vielen Dank. Es klappt. Das einzige, was ich jetzt nicht verstehe, ist Abfrage ist auf Konsole gedruckt ist anders mit Abfrage, wenn erklären. Kannst du mir erklären wieso? (Ich habe zusätzliche Informationen zur Frage gepostet, bitte schauen Sie) –

Verwandte Themen