2011-10-03 24 views
0

我有一個模型User,它可以是個人或公司,具體取決於布爾值is_company的值。如果用戶是公司,則company_name存儲該名稱;如果用戶是個人,first_namelast_name存儲他們的名字。在ActiveRecord中使用SELECT CASE語句,作爲Rails模型default_scope

在絕大多數情況下,我希望用戶按默認排序爲last_namecompany_name,所以我在我的用戶模型中使用了default_scope。

但是,我擁有它的方式 - 即使它適用於SQLLite - 也不是數據庫不可知的。任何人都可以讓我知道我可以重構這個在case語句中接受「true」的參數嗎?

default_scope select('users.*') 
default_scope select('CASE WHEN is_company = "t" THEN company_name ELSE last_name END AS sort_name') 
default_scope order('sort_name ASC') 

謝謝!

+0

也許你應該拆分這兩個實體? – Bohdan

回答

1

你可能想要做一個謙虛的重新設計你寫入數據庫的時間來處理這個問題。

  • display_name
  • 創建您的用戶表中的新列創建您的用戶模型before_save回調,設置顯示名稱,如:

    before_save :set_display_name 
    
    def set_display_name 
    self.display_name = self.is_company? ? self.company_name : self.last_name 
    end 
    
  • 更改default_scope只按訂單新列

+0

是的 - 這就是我要做的 - 會讓生活變得如此簡單! – Daniel

3

您需要重新考慮您的設計。一個可以成爲公司的用戶聽起來不像我的設計好。我認爲你最好單獨使用UserCompany型號。

你的排序,會更加容易過於這樣..

+0

很抱歉破壞這樣一個偉大的信譽號碼;) – Bohdan

+0

沒問題,我很高興達到1000 :) – rdvdijk

+0

問題是公司可以做的一切,用戶可以做的事情很少例外。唯一的區別是第一個/姓氏問題 – Daniel