web-dev-qa-db-ja.com

Rails 4 has_many for orderの非推奨の警告

class RelatedList < ActiveRecord::Base
  extend Enumerize

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

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

end

コンソールでレコードを作成しようとすると警告がスローされるRailsアプリにこのモデルがあります。

廃止の警告:RelatedList.has_many:contents宣言の次のオプションは廃止されました::order。代わりにスコープブロックを使用してください。たとえば、has_many:spam_comments、conditions:{spam:true}、class_name: 'Comment'は、has_many:spam_comments、-> {where spam:true}、class_name: 'Comment'のように書き換える必要があります。 (/Users/shivam/Code/auroville/avorg/app/models/related_list.rb:7から呼び出されます)

Rails 4にはモデルで使用するための新しい:order構文があるようですが、Rails Guidesでドキュメントを見つけることができないようです。

103
shankardevy

Rails 4では、:orderが非推奨になりました。質問で投稿した警告に示されているように、ラムダスコープブロックに置き換える必要があります。別の注意点は、dependent: :destroyなどの他の関連付けオプションの前にこのスコープブロックを渡す必要があることです。

これを試してみてください:

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

順序の方向、つまり@ joshua-coadyと@wsprujitが提案したようにascまたはdescを指定するには、次を使用します。

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

または、ハッシュスタイルを使用します。

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

has_manyのアクティブレコードスコープ の詳細なリファレンス。

243
vee

順序付けとインクルードの方法を理解するのにしばらく時間がかかりました。最終的に、あなたは scope ステートメントをチェーンすることがわかりました。

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

オプションハッシュ引数がある場合は、次のようにラムダの後に移動する必要があると付け加えます。

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

自分でこれを理解するのに少し時間をかけました-うまくいけば、同じ問題を抱えているこの質問に来ている人の助けになります。

22
Wylliam Judd

これはRails 4およびMongoDBで動作します

has_many :discounts, order: :min_amount.asc
0
Dave