2011-03-15 60 views
1

我有一個has_many結果的事件模型。我想根據事件中的字段排序結果。基於字段的嵌套模型的條件順序

我目前在事件:

has_many :results, :dependent => :destroy, :include => [:event], 
    :order => "IF(self.etype = 'Stroke', 'results.score ASC', 'results.score DESC')" 

...但是這deosn't工作。例如,有沒有更好的方式來與named_scope做到這一點? 對不起,我是新來的Rails。

+0

你爲什麼在你的查詢中做self.etype? – 2011-03-15 03:28:50

+0

根據'Event'中的'etype',我想要所有結果的不同順序。 – ubangy 2011-03-15 11:07:15

回答

1

嘗試這種情況:

has_many :results, :dependent => :destroy, :include => [:event], 
    :order => '#{(self.etype == "Stroke") ? 
        "results.score ASC" : "results.score DESC"}' 

當引用字符串或純紅寶石碼被用作一個屬性值,其在類裝載時間被評估。在這種情況下,selfclass而不是class的實例。由於用戶想要根據對象在手的屬性值改變ORDER BY的方向,所以應該將其包含在側單引號中。在這種情況下,selfclass的一個實例。

+0

爲什麼連字符串都打擾? '(self.etype ==「筆畫」)? 「results.score ASC」:「results.score DESC」' – 2011-03-15 03:32:36

+0

當您使用帶引號的字符串或普通的ruby代碼時,該值將在類加載時進行評估。在這種情況下,'self'是'Class'而不是'Class'的實例。由於用戶想要根據實例的屬性值更改「ORDER BY」方向,因此條件應該放在側單引號中。 – 2011-03-15 04:22:33

+0

現在我得到:「SQLite3 :: SQLException:無法識別的令牌:」#「:...」。有任何想法嗎? – ubangy 2011-03-15 10:32:07

0

這是否解決了它?

has_many :results, :dependent => :destroy, :include => [:event], :order => "IF(results.etype = 'Stroke', 'event.score ASC', 'event.score DESC')" 

如果不是這樣,當您嘗試這樣做在控制檯什麼錯誤返回:

Event.first.results 
+0

我現在甚至沒有嘗試過,因爲它沒有任何意義。 'score'在'Result'中,'etype'在'Event'中。 – ubangy 2011-03-15 11:48:01

+0

因此,您想要根據結果中的字段排序結果,而不是事件嗎?你的問題恰恰相反。 – ctide 2011-03-15 17:09:05

0

試試這個:

在軌3.0.x的

has_many :results, :dependent => :destroy, :include => [:event], 
    :order => "#{(proxy_owner.etype == 'Stroke') ? 
        'results.score ASC' : 'results.score DESC'}" 

In rails 3.xx:

has_many :results, :dependent => :destroy, :include => [:event], 
    :order => "#{(proxy_association.owner.etype == 'Stroke') ? 
        'results.score ASC' : 'results.score DESC'}" 

希望這會有所幫助。