2016-07-07 9 views
0

In meiner Rails-App habe ich eine CollectionProxy, die ein Array (denke ich) von Datensätzen ist. Ich möchte eine Aufzeichnung von der Mitte des Arrays nehmen und es am Anfang setzen. Ich kenne die Position des Elements nicht, aber ich kann es anhand eines Attributs im Benutzermodell finden. Es scheint so, als ob einige Methoden nicht für die Verwendung in einem CollectionProxy verfügbar sind.So verschieben Sie einen Datensatz in einem CollectionProxy in Schienen

Ich habe versucht:

user_images = user.images 
user_images.insert(0, user_images.delete(user.images.find_by_id(user.primary_image_id)) 

bekam aber einen Fehler, den ich 2 Argumente gab aber zu erwarten, 1. Ich bin zu raten, weil die Insert-Methode, die auf Arrays verwendet wird, um die gleiche Methode ist nicht auf collectionproxies verwendet wird . Was ist der beste Weg, dies zu tun?

Bearbeiten: Ich brauche nur, um die Elemente in der Ansicht anzuzeigen, muss ich nicht auf der Datenbankebene ändern.

+0

Sie müssen es in der Datenbankebene ändern oder nur in der Ansicht anzeigen? – Sravan

+0

@sravan nur in der Ansicht – user4584963

+0

welchen Artikel möchten Sie es am Anfang platzieren? – Sravan

Antwort

2

Da nur sehr wenige Methoden für den Sammlungs-Proxy verfügbar sind, ändern Sie zuerst den Sammlungs-Proxy in das Array und bearbeiten Sie ihn anschließend.

Hier ist der Code so zu tun,

user_images = user.images.to_a //converted collection to array 
user_images.unshift(user_images.detect{ |image| image.id == user.primary_image_id}).uniq //used unshift 
puts user_images 

Die Magie wir hier getan haben detect die Bilder, die das primäre Bild des Benutzers ist und unshift in Array Die unshift das Objekt am Anfang hinzufügt . Entfernen Sie nun das duplizierte Objekt, das bereits vorhanden ist, indem Sie uniq verwenden.

Das ist es Ihre erforderlichen Objekte kommt zuerst in das Array und Sie können dies in der Ansicht verwenden, wie aktive Datensatzauflistung verwendet wird.

+0

So konvertiert es in Array nur vorübergehend für die Ansicht und die Reihenfolge in ActiveRecord bleibt unverändert? – user4584963

+0

Ja, Bestellung im aktiven Datensatz bedeutet in db? – Sravan

+0

Sie können das primäre Bild zuerst in der Ansicht durch Umwandlung in Array anzeigen – Sravan

0

Es sieht so aus, als gäbe es derzeit keine Möglichkeit, den Anfang einer CollectionProxy hinzuzufügen. Die prepend und sort Methoden wurden entfernt. Hier ist die API für die veraltete prepend Methode: http://apidock.com/rails/v4.2.1/ActiveRecord/Associations/CollectionProxy/prepend

Sie könnten wieder denken, das leicht und verwenden Sie den append oder << Operator zusammen mit delete Elemente an das Ende der Sammlung zu kopieren und löschen Sie sie aus der Mitte. Es ist nicht ideal, aber es könnte ein Workaround sein, bis Sie eine bessere Lösung haben.

+0

Im Grunde müßtest du am Anfang anfangen und alles bis zum Ende verschieben, wobei du das Element überspringst, das du am Anfang haben wolltest. Sie werden mit der gleichen Reihenfolge der Elemente enden, außer dass die "übersprungene" am Anfang sein sollte. –