Rails 4の非推奨の警告、順序付きのhas_many


105
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、条件:{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ガイドにドキュメントがありません。

回答:


250

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

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

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

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

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

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

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

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


3
素晴らしい作品!そのような情報はガイドやドキュメントのどこにありますか?見つかりません。ありがとう。
shankardevy 2013


4
あなたが複数の古いオプションを持っている場合については、何と言うoderinclude?これ:{ order(:position), include(:track) }コンマでエラーをスローします。
角兵衛

2
asc / descを注文するには、次を使用します-> { order(name: :asc) }
wspruijt '25

1
なんらかの理由で、コレクションを何度か注文したい場合list.contents.order('position desc')は、モデルの侵入としてではなく、全体としてより効率的にすることもできます(投票された回答では、リストはコンテンツのフィールドを知っており、ここではコントローラーが知っています)
Dirty Henry

35

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

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

2
これはまさに私の問題でした。親属性によってhas_many関係を順序付ける方法を理解しようとしています。このようなインクルードを実行して注文できることに気づかなかった。ありがとう!
timothyashaw 2017

27

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

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

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


3
-また、これはオブジェクト上に存在する可能性がある団体「から」真のであるhas_many :items, -> { order 'name' }, through: :suppliers
主な主要

0

これは私にとってRails 4とMongoDBで動作します

has_many :discounts, order: :min_amount.asc

-4

または、orderモデルに節を配置することもできます。たとえば、次のようにします。

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

なる

has_many :options # In class Answer

default_scope { order 'name' } # In class Option

PS:やったArgumentError: wrong number of arguments (1 for 0)ときに得たhas_many :things, -> {}


4
デフォルトのスコープを使用しないでください。慣れている場合は、その魔法のメソッドにロジックを追加できます。将来、オーバーライドするのは困難です。
GrzegorzŁuszczek2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.