2017-01-25 3 views
1

Ich habe folgende ModelleSchienen 3 ActiveRecord # enthält Fehler?

class Account < ActiveRecord::Base 
    belongs_to :user 
end 

class User < ActiveRecord::Base 
    attr_accessible :email 
    has_many :accounts 
end 

Soweit ich weiß, um alle Konten auszuwählen, die für alle Benutzer mit E-Mail mit einem Muster übereinstimmen, wir kommen

Account.joins(:user).where("users.email ILIKE ?", '%pattern%') -> work 

Und hier tun müssen die Magie kommt, umfasst das ersetzen mit beitritt, arbeitet immer noch wie ein Zauber

Account.includes(:user).where("users.email ILIKE ?", '%pattern%') -> work 

Aber

Account.includes(:user).where("users.email ILIKE ?", '%pattern%').count -> error 

Eine Erklärung? ist nur für Eager Loading nur nicht enthalten?

+0

können Sie den Fehler schreiben Sie bekommen ? – jithya

+0

versuchen ,. "Account.includes (: user) .where (" users.email ILIKE? ","% Pattern% '). Length " – Sravan

+0

Includes führt tatsächlich einen linken äußeren Join aus, wenn Sie die Tabelle in where-Bedingung verwenden, weshalb Sie erhalten Ergebnis –

Antwort

1

Da ohne explizite Referenz includes lädt Relation in einer separaten Abfrage. Schauen Sie sich auf Schienen Konsole:

[11] pry(main)> Account.includes(:user) 
    AccountsUser Load (4.6ms) SELECT "accounts".* FROM "accounts" 
    User Load (11.7ms) SELECT "users".* FROM "users" WHERE "users"."id" IN (... 

[11] pry(main)> Account.includes(:user).where("users.email ILIKE ?", '%pattern%').to_sql 
    SELECT "accounts".* FROM "accounts" WHERE (users.email ILIKE '%admin%') 

Deshalb sollten Sie einen Fehler bekommen - users Tabelle wird nicht in einer Abfrage verwiesen. Referenzieren Verwendung Benutzer-Tabelle entweder references oder eager_load:

Account.includes(:user).references(:users).where("users.email ILIKE ?", '%pattern%').count 

oder

Account.eager_load(:user).where("users.email ILIKE ?", '%pattern%').count 

Beachten Sie, dass includes Werke mit Namen Verband während references des aktuellen Tabellennamen muss

+0

Aber das Problem ist 'Account.includes (: user) .where (" users.email ILIKE? ", '% pattern%') 'funktioniert immer noch gut, es bricht nur, wenn Anruf eine Zählung 'Account.includes (: user) .where (" users.email ILIKE? ","% pattern%'). count " – nqtien310

Verwandte Themen