2014-07-04 35 views
0

我有這樣的方法可以將「本」在一個字符串的結尾,如果它是在字符串中Novel.class開頭:排序!似乎忽略自定義屬性

def sort_name 
    display_name = self.name 
    if display_name.match(/^the/i) 
     arr = display_name.split(/^the/i) 
     display_name = "#{arr[1]}, The" 
    end 
    display_name 

NovelController有這樣的指數方法:

def index 
    @novels = Novel.all 

    @novels.to_a.sort! { |a,b| a.sort_name.downcase <=> b.sort_name.downcase } 

    respond_to do |format| 
    format.html # index.html.erb 
    format.json { render :json => @novels } 
    end 
end 

在視圖中我只顯示sort_name。正在顯示sort_name,但小說仍按name排序。有人看到缺陷嗎?謝謝。

回答

3

這裏的問題是丟棄了排序的數組。

@novels.to_a 

這將返回一個臨時數組(不保存在任何地方)。那個臨時數組然後就地排序並被遺忘,因爲你沒有任何引用。

解決方案:將其保存到一個變量中。

@novels = Novel.all.sort { |a,b| a.sort_name.downcase <=> b.sort_name.downcase } 

此外,您在您的sort_name代碼中有一個錯誤。它返回如下值:

# for name "The Yellow God" 
display_name # => " Yellow God, The" 
+0

出於某種原因,實際上將所有修改後的字符串放在默認值之前。例如,「黃神,這個」在「艾倫和...」之前有什麼想法? –

+0

@JoeEssey:嗯,也許activerecord批處理是行爲不端。嘗試獲得完整的數組:'Novel.all.to_a.sort ...' –

+0

這實際上是我得到的:'@novels = Novel.all.to_a.sort {| a,b | a.sort_name.downcase <=> b.sort_name.downcase}' –