2017-11-28 2 views
1

Ich habe Tabellen - users und articles. Es ist eine zu viele Beziehung oder Benutzer kann viele Artikel haben. Was ich will, ist, alle Benutzer aus users Tabelle mit LIMIT 40 auszuwählen, aber zählen zählen alle Artikel für jeden Benutzer - Eigenschaft für jeden Benutzer hinzufügen count_articles. Ich versuche auf diese Weise:Attribut zu Rails 5 Modell hinzufügen, das nicht in der Datenbank existiert

def self.get_users(limit, offset) 
    users = [] 
    order('created_at').limit(limit).offset(offset).each do |user| 
    user.attributes[:count_articles] = user.articles.count 
    users << user 
    byebug 
    end 
    users 
end 

, aber ich bekomme Benutzer ohne dieses Attribut. Wenn ich byebug verwende und die Konsole eintippt - user.count_articles, kann ich das Ergebnis von count_articles für den aktuellen Benutzer sehen, aber wenn ich nur user eintippe, sehe ich alle Attribute ohne count_articles.

+0

Die Methode 'ActiveRecord :: Base # inspect' in Rails 5.0 enthält nur Spaltennamen. Rails 5.1 enthält virtuelle Attributnamen. –

+0

Haben Sie das gelöst? –

Antwort

1

Sie könnten versuchen, mit:

User.joins(:articles) 
    .select('users.id, users.name, COUNT(articles.id) AS count_articles') 
    .group('users.id') 
    .limit(40) 
+0

Hallo, danke für die Antwort. Das gibt mir keinen Benutzer zurück, wenn es keinen Artikel für ihn gibt. Ich habe mit linkem Join wie folgt 'Joins ("LINKER JOIN-Artikel ON users.id = articles.user_id") korrigiert. Select() '. Ich weiß, dass die Art und Weise, die funktioniert, der beste Weg ist :), aber ich dachte, dass es einen besseren Weg von Rails gibt. – gdfgdfg

+0

'left_joins' vielleicht? 'User.left_joins (: articles) .select ('users.id, users.name, COUNT (artikel.id) AS count_articles'). Group ('users.id')' –

0

Ich mache s.th. ähnlich mit einer Unterauswahl. Daher ist kein Beitritt erforderlich.

Versuchen Sie, diese in Ihr Benutzer-Modell setzen:

def self.get_users(limit=40, offset=0) 
    order(:created_at) 
    .limit(limit) 
    .offset(offset) 
    .select('users.*, (SELECT COUNT(id) FROM articles WHERE articles.id = users.id) articles_count') 
end 

Die resultierenden Benutzerinstanzen in dem zurückgegebenen Array wird dann das Attribut „articles_count“.

Verwandte Themen