PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Rails 4:Użycie funkcji PostgreSQL w celu powoduje błąd w zapytaniu z powodu braku dołączenia tabeli include

Załóżmy, że musisz uzyskać nazwę użytkownika z pierwszych pięciu postów. Szybko piszesz poniższe zapytanie i cieszysz się weekendem.

posts = Post.limit(5)

posts.each do |post|
  puts post.user.name
end

Dobrze. Spójrzmy jednak na zapytania

Post Load (0.5ms)  SELECT  `posts`.* FROM `posts` LIMIT 5
User Load (0.3ms)  SELECT  `users`.* FROM `users` WHERE  `users`.`id` = 1 LIMIT 1
User Load (0.3ms)  SELECT  `users`.* FROM `users` WHERE  `users`.`id` = 1 LIMIT 1
User Load (0.3ms)  SELECT  `users`.* FROM `users` WHERE  `users`.`id` = 2 LIMIT 1
User Load (0.3ms)  SELECT  `users`.* FROM `users` WHERE  `users`.`id` = 2 LIMIT 1
User Load (0.3ms)  SELECT  `users`.* FROM `users` WHERE  `users`.`id` = 1 LIMIT 1

1 query aby pobrać wszystkie posts i 1 query aby pobrać users dla każdego posta daje łącznie 6 queries . Sprawdź poniższe rozwiązanie, które robi to samo, tylko w 2 queries :

posts = Post.includes(:user).limit(5)

posts.each do |post|
  puts post.user.name
end

#####

Post Load (0.3ms)  SELECT  `posts`.* FROM `posts` LIMIT 5
User Load (0.3ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` IN (1, 2)

Jest jedna mała różnica. Dodaj includes(:posts) na Twoje zapytanie i rozwiązany problem. Szybko, przyjemnie i łatwo.

Ale nie dodawaj po prostu includes w zapytaniu bez właściwego zrozumienia. Używanie includes z joins może skutkować połączeniami krzyżowymi w zależności od sytuacji, a w większości przypadków nie jest to potrzebne.

Jeśli chcesz dodać warunki do dołączonych modeli, musisz wyraźnie się do nich odnieść . Na przykład:

User.includes(:posts).where('posts.name = ?', 'example')

Zgłosi błąd, ale to zadziała:

User.includes(:posts).where('posts.name = ?', 'example').references(:posts)

Zauważ, że includes działa z association names podczas gdy references potrzebuje the actual table name .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Usuń parę klucz-wartość z zagnieżdżonej tablicy jsonb w postgresql

  2. Znajdowanie lasu opinającego (Z REKURSIVE, PostgreSQL 9.5)

  3. Jak auto-inkrementować w PostgreSQL?

  4. Wartości NULL dla referential_constraints.unique_constraint_* kolumn w schemacie informacyjnym

  5. Pobierz wartość kolumny poprzedniego wiersza w postgresie nie może użyć funkcji okna w UPDATE