2016-05-03 9 views
0

Zur Zeit habe ich ein Bereich, der meine Aufzeichnungen in der folgenden Standardauftrag zieht sich zurück:Return Datensätze in einer ungewöhnlichen Offset um

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 

und es wird in einen HTML-Block umgewandelt, die als so angelegt ist:

1 2 3 4 
5 6 7 8 
9 10 11 12 
13 14 15 16 

ich möchte einen hTML-Block, der wie so angelegt ist:

1 6 11 16 
2 7 12 
3 8 13 
4 9 14 
5 10 15 

also ich denke, ich brauche die Aufzeichnungen zurück in th ziehen e folgende Reihenfolge - (Aufzeichnungen durch die Anzahl der Reihen versetzt) ​​

1 6 11 16 2 7 12 3 8 13 4 9 14 5 10 15 

Jede Idee, was der sauberste Weg, dies in Rails/Active zu tun?

+0

Kundenbestellung direkt aus der db ist möglich, aber extrem klobig und ich würde es nicht empfehlen. Ich würde die Reihenfolge in der Ansicht implementieren, wenn möglich, oder den Controller. Ich bin nicht zu sehr auf Front-End, aber ich wette, es gibt einige CSS/Javascript-Paket, das Sie verwenden können, um Elemente in Spalten mit sehr wenig Aufwand anzuzeigen. Andernfalls können Sie die Reihenfolge im Controller mit einer beliebigen Ruby-Logik schreiben, die Sie sich vorstellen können, z. B. mit der Methode 'transpose' in Array. Dies wird unendlich viel lesbarer und wartbarer als der Versuch, die Datensätze in einer bestimmten benutzerdefinierten Reihenfolge aus der Datenbank abzurufen. –

Antwort

1

Sie müssen wissen, wie viele Spalten Sie schließlich darstellen möchten. Ich denke, das muss für Sie arbeiten:

columns = 5 
MyModel.order(:id).in_groups_of(columns).transpose 

Und Sie erhalten eine Reihe von Linien, von denen jeder mit einer Reihe von Datensätzen.

Wenn Sie ein einzigartiges Array möchten, können Sie am Ende .flatten hinzufügen.

+0

Großartiges Zeug. Das war der Weg zu gehen. Sie müssen die Spalten nicht kennen: '.in_groups (columns) .transpose.flatten.reject (&: blank?)' –

+0

Ja, Sie haben Recht. –

0

Kann das nicht mit AR-Bestellung tun! Sie müssen dies in Ihrem Controller oder in der Ansicht tun.

+0

huh, irgendein Beispiel, das du teilen möchtest? –

+0

Hier ist der Anfang: 'num = 5; array.each_slice (num) .with_index {| (* Spalten), i | Spalten [i] = Spalten}; columns.length.times {| i | ...} '. – Uzbekjon

Verwandte Themen