2012-07-03 21 views
1

可以說我有兩個模型一個業務和一個時間槽,關係是business has_many :timeslots。每個時隙有一天列存儲像'Monday', 'Tuesday'Rails的ActiveRecord如何做一個has_many關係的自定義排序

的DAYNAME當我做

bussiness.time_slots 

我得到的是沒有排序的時隙。我希望按照日期名稱(而不是字母排序)對時隙進行排序。 「星期一」的時段比「星期二」先出現,等等。

我認爲SQL不能幫助我,因爲排序是定製的,我將需要重新梳理後,我閱讀,但我很關心在哪裏把它的代碼

我可以這樣做

在我的控制器

b = current_business 
TimeSlot.find_sorted_with_busines(b) 

在我的時隙型號

def find_sorted_with_business(b) 
    b.time_slots 
    # sort timeslots using custom sorting here and return 
end 

,但我不喜歡傳遞一個業務對象或ID的時隙模型的想法,我應該能夠做到像

b = current_business 
b.sorted_timeslots 

我該怎麼辦呢?如何定製做

思路排序基於DayNames中,也歡迎:)

感謝

+0

之間你有沒有考慮存儲整數,而不是一天的名字。會讓它更容易分類。你可以重寫getter和setter從天名到整數或相反。只是一個想法。 – Robin

+0

從來沒有想到的..看起來像一個不錯的主意,我認爲這將有助於消除大量的混亂。我要試一試 – Abid

+0

@Robin如果您將此解答爲答案,我將接受 – Abid

回答

2

您應該考慮存儲整數數據庫而不是日期名稱。它會讓事情更容易分類,並且可能更具性能。

然後,您可以覆蓋day getter(從整數返回日期名稱)和setter(存儲與日期名稱對應的整數)。根據你從表單中得到的內容,你可能不需要重寫setter。

不要忘記有一個自定義的驗證,以檢查整數爲1和7

+0

緊隨其後並努力工作。謝謝:) – Abid

+0

很高興幫助:) – Robin

1

你可以做定製與SQL排序:

SELECT * 
FROM my_table 
ORDER BY CASE 
     WHEN dayname = 'Monday' THEN 1 
     WHEN dayname = 'Tuesday' THEN 2 
     . 
     . 
     WHEN dayname = 'Sunday' THEN 7 
     ELSE 8 
    END 

但最好是隻使用列類型的一個int像羅賓建議,然後使用該數字來獲取日期名稱和訂單將更簡單

+0

+1作爲自定義排序的選項! –

相關問題