2009-07-14 31 views
40

我在has_many關係中有兩個模型,例如Log has_many Items。然後,Rails很好地設置瞭如下內容:some_log.items,它將所有關聯的項返回給some_log。如果我想基於項目的模型不同的字段訂購這些項目有沒有辦法通過一個類似的結構要做到這一點,還是一個具有分解成類似:在相關的模型中導航按順序

Item.find_by_log_id(:all,some_log.id => "some_col DESC") 

回答

74

有多種方式要做到這一點:

如果你想該協會的所有來電訂購這樣一來,當您創建的關聯,如下您可以指定排序:

class Log < ActiveRecord::Base 
    has_many :items, :order => "some_col DESC" 
end 

你也可以用做named_scope,這將允許該順序爲e asily指定的任何時間項被訪問:

class Item < ActiveRecord::Base 
    named_scope :ordered, :order => "some_col DESC" 
end 

class Log < ActiveRecord::Base 
    has_many :items 
end 

log.items # uses the default ordering 
log.items.ordered # uses the "some_col DESC" ordering 

如果你總是希望在默認情況下,以同樣的方式來訂購的物品,你可以使用default_scope方法(用Rails 2.3新),具體如下:

class Item < ActiveRecord::Base 
    default_scope :order => "some_col DESC" 
end 
+12

由於滑軌3.x,named_scope語法略有不同。現在使用「範圍」而不是「named_scope」調用它,並使用函數來定義範圍結構。例如:「scope:ordered,order(」some_col DESC「)」。 – 2011-11-16 20:17:27

+11

在Rails 4中還有另一種方法。默認的關聯範圍應該被指定爲一個lambda,比如`has_many:items, - > {order(:some_col).where(foo:'bar')}`,同樣,命名範圍現在採用lambda`scope:name_of_scope, - > {where(foo:'bar')}`。默認範圍需要一個塊:`default_scope:{where(foo:'bar')}` – Leo 2013-10-24 15:32:52

4

這些任選其一:

Item.all(:conditions => {:log_id => some_log.id}, :order => "some_col DESC") 
some_log.items.all(:order => "some_col DESC") 
3

設置default_scope在模型類

class Item < ActiveRecord::Base 
    default_scope :order => "some_col DESC" 
end 

這將工作

16

導軌4.2.20語法要求用塊調用:

class Item < ActiveRecord::Base 
    default_scope { order('some_col DESC') } 
end 

這也可與替代的語法被寫成:

default_scope { order(some_col: :desc) }