2013-08-17 27 views
86
class RelatedList < ActiveRecord::Base 
    extend Enumerize 

    enumerize :list_type, in: %w(groups projects) 

    belongs_to :content 
    has_many :contents, :order => :position 

end 

當我嘗試在控制檯中創建記錄時,在我的Rails應用程序中引發了此警告。已過時Rails 4 has_many已過時的警告

棄權警告:您的 RelatedList.has_many:內容聲明中的以下選項已被棄用::order。 請改爲使用範圍塊。例如,以下內容:has_many :spam_comments,條件:{spam:true},class_name:'Comment' 應重寫爲以下內容:has_many:spam_comments, - > { 其中spam:true},class_name:'Comment ' 。 (從/Users/shivam/Code/auroville/avorg/app/models/related_list.rb:7調用)

好像軌道4具有新:在車型使用順序的語法,但我不能似乎在Rails指南中找到文檔。

回答

214

在Rails 4中,:order已被棄用,需要用lambda作用域塊替換,如問題中發佈的警告中所示。還有一點要注意的是,這個範圍塊需要在任何其他關聯選項,如dependent: :destroy

傳遞試試這個:

has_many :contents, -> { order(:position) } 

要指定順序方向,即無論是ascdesc作爲@約書亞 - 科迪和@wsprujit建議,使用:

has_many :contents, -> { order 'position desc' } 

,或者使用哈希風格:

has_many :contents, -> { order(position: :desc) } 

關於Active Record Scopes for has_many的進一步參考。

+3

作品非常棒!我在哪裏可以在指南或文檔中找到這些信息?我找不到一個。謝謝。 – shankardevy

+1

[指南中的訂購範圍信息](http://guides.rubyonrails.org/association_basics.html#scopes-for-has-many-order) –

+4

如果您有多個棄用的選項,比如'oder '和'包括'?這:'{order(:position),include(:track)}'在逗號上拋出錯誤。 – kakubei

26

我花了一段時間來弄清楚如何做單,並加入,我終於找到你chain the scope陳述,

has_many :things, -> { includes(:stuff).order("somedate desc") }, class_name: "SomeThing" 
+0

這正是我的問題。試圖找出如何通過父屬性來定義has_many關係。沒有意識到你可以做這樣的事情,然後訂購。謝謝! – timothyashaw

-4

或者,你可以把order條款的模型,例如:

has_many :options, order: 'name' # In class Answer 

變爲

has_many :options # In class Answer 

default_scope { order 'name' } # In class Option 

P S:在做has_many :things, -> {}時我得到了ArgumentError: wrong number of arguments (1 for 0)

+4

請勿使用默認範圍。如果你習慣這樣做,你可以在這個神奇的方法中添加更多的邏輯。將來很難覆蓋它。 –

13

想我要補充一點,如果您有任何選項哈希參數,他們有拉姆達去後,像這樣:

has_many :things, -> { order :stuff }, dependent: :destroy 

花了一分鐘算出這個我自己 - 希望它幫助任何人來這個問題有同樣的問題。

+0

對於對象上可能存在的「通過」關聯,也是如此:'has_many:items, - > {order'name'},通過:: suppliers' –