2016-05-18 20 views
1

Ich habe folgende Modelle:Rails GROUP_BY mit leeren Ergebnissen

class Task 
    belongs_to :task_category 
end 

class TaskCategory 
    has_many :tasks 
end 

Ich möchte Gruppenaufgaben durch Aufgabe Kategorie und das funktioniert für mich:

Task.all.group_by(&:task_category) 
# => 
{ 
    #<TaskCategory id: 1, name: "call", ... } =>[#<Task id: 1, ...>, #<Task id: 2, ...>], 
    #<TaskCategory id: 2, name: "event", ... } =>[#<Task id: 3, ...>, #<Task id: 4, ...>] 
} 

Das Problem ist, ich alle Aufgabenkategorien wollen zurück auch wenn die Aufgabensammlung leer ist. Daher wäre so etwas wie dies funktioniert:

#<TaskCategory id: 3, name: "todo", ... } =>[] 

In diesem Fall hat die Aufgabe Kategorie keine Aufgaben, so dass der Wert ist ein leeres Array. Unterstützt die group_by eine Option, um dies zuzulassen? Wenn nicht, kann dies elegant in einem One-Liner erfolgen?

Antwort

2

TaskCategory.all.includes(:task) würde funktionieren, nicht wahr? Die Daten, die Sie erhalten, wären in einem etwas anderen Format, aber nicht signifikant.

+0

Ja, Sie haben Recht, und die Verwendung von Includes ermöglicht es mir, über die Sammlung zu iterieren, ohne weitere Abfragen zu starten. – Donato

+0

@Donato ist einfach eager_loading – 7urkm3n

0

Wenn Sie nur TaskCategory.all tun, können Sie die Aufgaben nach der Kategorie gruppiert, die Sie benötigen. Das Format ist nicht genau das gleiche, aber gruppiert nach wie vor so, wie Sie es wollen:

TaskCategory.all 
# Assuming the first TaskCategory has no tasks 
TaskCategory.all.first.tasks 
=> #<ActiveRecord::Relation []> 

A TaskCategory ohne tasks würde #<ActiveRecord::Relation []> ergeben, die zu [] etwas gleichwertig ist.

Verwandte Themen