2016-05-26 6 views

Odpowiedz

7

Aby znaleźć właściwości user z min, możesz mply zrobić,

User.joins(:properties).group("properties.user_id").order("count(properties.user_id) desc").last 

i znaleźć user z max właściwości,

User.joins(:properties).group("properties.user_id").order("count(properties.user_id) desc").first 

Uwaga: Ponieważ jej łączyć pracę z properties, więc user bez properties nie pojawi się w tym zapytaniu.

5

można użyć counter_cache.

Opcja :counter_cache może być wykorzystana do zwiększenia wydajności przynależnych obiektów.

Od here

belongs_to :user, counter_cache: true 

Następnie należy utworzyć migracji:

def self.up 
    add_column :users, :properties_count, :integer, :default => 0 

    User.reset_column_information 
    User.find(:all).each do |u| 
    User.update_counters u.id, :properties_count => u.properties.length 
    end 
end 

Następnie można pobierał użytkownikiem, max properties_count

User.maximum("properties_count") 

Oto niesamowite RailsCast o counter_cache

4

myślę, że można zrobić tak przez zakresów

class User 
    has_many :properties 
    scope :max_properties, 
    select("users.id, count(properties.id) AS properties_count"). 
    joins(:properties). 
    group("properties.id"). 
    order("properties_count DESC"). 
    limit(1) 

    scope :min_properties, 
    select("users.id, count(properties.id) AS properties_count"). 
    joins(:properties). 
    group("properties.id"). 
    order("properties_count ASC"). 
    limit(1) 

I wystarczy zadzwonić User.max_properties i User.min_properties

AKTUALIZACJA:

Będzie aslo pracę jak Boorama suggeted

class User 
    has_many :properties 
    scope :max_properties, 
    select("users.*, count(properties.id) AS properties_count"). 
    joins(:properties). 
    group("users.id"). 
    order("properties_count DESC"). 
    limit(1) 

    scope :min_properties, 
    select("users.*, count(properties.id) AS properties_count"). 
    joins(:properties). 
    group("users.id"). 
    order("properties_count ASC"). 
    limit(1) 
+0

Myślę, że powinieneś pogrupować według 'users.id', a nie' properties.id', aby to zadziałało. Możesz także wybrać 'users. *' Zamiast tylko 'id', aby zwracany użytkownik był użyteczny jako normalny rekord railsowy ze wszystkimi atrybutami. – BoraMa

+1

@ BoraMa, @Thorin możesz grupować według 'users.id' i wybierać tylko' users.id' zamiast 'users. *', Ponieważ 'users. *' Obsługuje tylko w 'mysql'. 'PG' nie pozwala na wybieranie kolumn innych niż kolumna grupy i funkcja agregująca –

Powiązane problemy