2012-05-30 31 views
3

我的數據庫中的每個company都有很多projects,每個公司在註冊時都會獲得一個「常規任務」項目。這個特定的項目不能被公司刪除,並且它被視爲tasks的特殊存儲庫,尚未分配給公司的其他項目之一。在ActiveRecord中手動排序

當顯示公司的項目時,我希望它們按字母順序顯示,但只有一個例外,即「常規任務」出現在頂部。這需要對項目進行某種特殊處理以進行分類。我如何可以採取:

@projects = @company.projects 

和排序,使我們得到一個列表如下:

'General tasks' 
'ABC Project' 
'BFA Project' 
'ZNS Project' 

回答

2

您可以在SQL做到這一點。這是一個在PostgreSQL中可用的例子。無法弄清楚如何製作一個與數據庫無關的版本,但你應該可以將它定製到你的RDBMS。

!=返回一個布爾值,並在PostgreSQL的false到來之前true所以我們需要不等於確保名爲記錄「常規任務」首先顯示。剩餘的項目將按其名稱排序。

另一種方法是將列添加到您的項目表,標誌了「常規任務」的項目作爲特殊,如:

add_column :projects, :permanent, :boolean, :default => false 

然後,您可以進行排序,而無需使用原始的SQL:

@projects = @company.projects.order(:permanent, :name) 
0

正如我回答here,我剛剛發佈了一個寶石(order_as_specified),它允許你做本地SQL排序是這樣的:

@company.projects.order_as_specified(name: ['General tasks', 'ABC Project', ...]) 

如果您不知道(或不想計算)提前完整選項列表,那麼對您的用例可能並不好。好的一點是它適用於Postgres,MySQL和SQLite。