2012-04-10 4 views
0

にHABTMのデータを並べ替え、私は次のデータベースがあります。ユーザー(users/show.html.haml)のためのビューでレール

class User < ActiveRecord::Base 
    has_and_belongs_to_many :apps 

class App < ActiveRecord::Base 
    has_and_belongs_to_many :users 

を私は、現在のユーザが持っているものでソートすべてのアプリを一覧表示します。

%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 

私の質問は、並べ替えを行うために何を並べ替えるかです。

答えて

2

またはこのような何かを経由:

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

それを行うには複数の方法があります!

0

orderメソッドでは、必要なAppのメソッド名を置くことができます。これは、

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

またはその他のものです。

+0

user.apps.order @ を。 'App.order(@ user.apps.include?(this))'やそのようなものをどうしたいのですか? –

1

私が正しく理解している場合は、現在のユーザーに属しているものを先頭にしてアプリを並べ替える必要があります。私はこれが1つのクエリで可能だとは思わない。そして、あなたはこの@apps配列を反復処理することができ、かつ要素が希望の順序になります

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

:私は、最も簡単な方法は、2つのクエリに分割することだと思います。

+0

@jdoeはやや綺麗に見えるコードを持っています。しかし、ありがとう。 –

+1

心配はいりません。 'include?'部分は 'O(n)'から 'O(n^2)'までとどまるので、その解決策は少し遅くなることに留意してください。あなたのリストがかなり長くなるのでなければ気づくべきではありません。 – tsherif

+0

良い点。私はあなたのことが「O(n)」だと言っているのですが、それはdbを2回横断します。テーブルが大きくなったらそれはずっと良いです。それは私がAppで100レコードの注文を期待しているので重要ではありません。 –

0

これを試してみてください:(:名)私は、私も私の例のコードでそれを持っていることを実感

+0

彼は所有していないアプリは含まず、そのアプリにしかリンクがありません。私は**すべての**アプリを表示する必要があります。 –