2012-04-10 10 views
0

Ich habe die folgende Datenbank:Sortierung HABTM Daten in Schienen

class User < ActiveRecord::Base 
    has_and_belongs_to_many :apps 

class App < ActiveRecord::Base 
    has_and_belongs_to_many :users 

In der Ansicht für einen Benutzer (users/show.html.haml) Ich alle die sortierten Apps von denen der aktuelle Benutzer hat auflisten möchten.

%table 
    %thead 
    %tr 
     %th Name 
     %th Available 
    - for app in App.order("??????") 
    %tr 
     %td= link_to app.name, app_path(app) 
     %td 
     - if @user.apps.include?(app) 
      %i.icon-ok 
     - else 
      %i.icon-remove 

Meine Frage ist, was ich in die Reihenfolge-Funktion, um die Sortierung zu tun.

Antwort

2

oder über etwas wie folgt aus:

App.all.partition{|app| @user.apps.include?(app)}.flatten 

Es gibt mehr als einen Weg, es zu tun!

0

In der Bestellmethode können Sie den gewünschten Methodennamen einer App eingeben. Es kann sein

App.order(:id) 
App.order(:name) 
App.order(:created_at) 

oder irgendetwas anderes.

+0

Ich weiß, dass ich es auch in meinem Beispiel-Code. Wie sage ich, ich möchte 'App.order (@ user.apps.include? (This))' 'oder etwas zu diesem Zweck –

1

Wenn ich richtig verstehe, möchten Sie die Apps mit denen des aktuellen Benutzers zuerst kommen sortieren. Ich glaube nicht, dass dies in einer Abfrage möglich ist. Ich denke, der einfachste Weg, um es in zwei Abfragen spalten würde:

user_apps  = current_user.apps 
non_user_apps = App.where(:id.not_in => current_user.app_ids) 
@apps   = user_apps + non_user_apps 

Dann können Sie ihn nur @apps Array iterieren und die Elemente in der Reihenfolge Sie wollen.

+0

@jdoe hat einen etwas sauberer aussehenden Code. Trotzdem danke. –

+1

Keine Sorgen. Denken Sie daran, dass diese Lösung etwas langsamer sein wird, da der 'include?' - Teil von 'O (n)' nach 'O (n^2) 'geht. Sie sollten es nicht bemerken, es sei denn, Ihre Liste wird ziemlich lang. – tsherif

+0

Guter Punkt. Habe ich recht, wenn ich sage, dass es "O (n)" ist, aber dass es die db zweimal durchquert; das ist viel besser, wenn der Tisch groß wird. Es sollte egal sein, wie ich von der Reihenfolge der 100 Datensätze in App erwarte. –

0

Versuchen Sie folgendes: @ user.apps.order (: name)

+0

Das wird nicht die Apps beinhalten, die er nicht besitzt, nur die eine hat einen Link zu. Ich muss ** alle ** die Apps zeigen. –