5

Mam model User.Chętne ładowanie z has_many przez

A user ma wiele integrations.

An jest dołączone do profile przez integration_profiles, który zawiera kolumnę data.

Chcę bardzo szybko załadować wszystkie profile użytkownika.

class Integration < ActiveRecord::Base 
has_many :integration_profiles 
has_many :profiles, through: :integration_profiles 
end 

class IntegrationProfile < ActiveRecord::Base 
belongs_to :integration 
belongs_to :profile 
end 

class Profile < ActiveRecord::Base 
has_many :integration_profiles 
has_many :integrations, through: :integration_profiles 
end 

Próbowałem to:

all = User.first.integrations.includes(:profiles) 

Ale kiedy zrobiłem all.count

=> 2 

Ale kiedy zrobić

all = User.first.integrations.joins(:profiles) 
all.count 
=> the correct total 

powinienem być przy użyciu obejmuje lub łączy? Ja zawsze obejmuje więc nie wiem, dlaczego to nie działa tutaj

Odpowiedz

3

Kiedy robisz

all = User.first.integrations.joins(:profiles) 
all.count 

zapisy Integrations będzie liczony dla pierwszego User i sprzężenie wewnętrzne zapytanie na profiles.

A kiedy robisz

all = User.first.integrations.includes(:profiles) 
all.count 

ponownie pojawi się liczyć integracje lecz bez przyłączyć zapytanie z profili jako profile są chętni załadowany z oddzielnych zapytań powodu includes

Wydaje się, że po prostu chcesz liczyć profiles związane z danym user. Najlepszym sposobem osiągnięcia tego celu byłoby, aby utworzyć stowarzyszenie między User i Profile modelu

User ==> has_many :profiles, through: :integration

Gdy to zrobisz, możesz bezpośrednio przejść User.first.profiles.count aby uzyskać liczbę wszystkich związanych profili danego użytkownika.

Inną opcją będzie (jeśli nie chcesz używać powyższej opcji), aby przejrzeć wszystkie integrations i podsumować wszystkie profiles.count dla każdej integracji.

Wybierz opcję, która najlepiej odpowiada Twoim potrzebom.

+0

hi @KirtiThorat, jak mógłbym cofnąć się i zadzwonić lub wybrać wspólny model, który łączy integrację i profile? –

0

zapytaniu 1

all = User.first.integrations.includes(:profiles)

all.count wraca rachubę integracji, a nie z profilu. Profil jest ładowany z zapałem.

Jeśli chcesz poznać liczbę profili, musisz to zrobić w ten sposób.

ar = [ ] 

all.each do |a| 
    ar << a.profiles.count 
end 

ar.reduce(:+) daje taką samą liczbę po uruchomieniu kwerendy 2.

Query 2

all = User.first.integrations.joins(:profiles)

all.count

W przypadku Query 2, jego powracających Ci integracje z tabeli integartion_profiles.

Select users from users limit 1;

Select integrations from integrations INNER JOIN integration_profiles on integration_profiles.integration_id = integrations.id where integrations.user_id = 'id of user'

Aby dowiedzieć się więcej na ten temat zadzwoń .to_sql na Query 1 i Query 2.

Jeśli chcesz zrobić zachłanne ładowanie następnie zastosowania obejmuje jest preferowanym rozwiązaniem.

+0

Okej Chciałbym zrobić tak trudne ładowanie, żebym mógł nazwać 'User.first.profiles', jak mogę się tak wcześnie załadować? –

Powiązane problemy