110
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. 代わりにスコープ ブロックを使用してください。たとえば、次のように書き換える必要があります。(/Users/shivam/Code/auroville/avorg/app/models/related_list.rb:7 から呼び出されます)

Rails 4 にはモデルで使用するための新しい :order 構文があるようですが、Rails ガイドでドキュメントが見つからないようです。

4

5 に答える 5

256

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

これを試してください:

has_many :contents, -> { order(:position) } # Order by :asc by default

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

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

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

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

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

于 2013-08-17T02:50:49.550 に答える
38

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

has_many :things, -> { includes(:stuff).order("somedate desc") }, class_name: "SomeThing"
于 2014-05-29T01:06:32.823 に答える
31

オプションのハッシュ引数がある場合は、次のようにラムダの後に移動する必要があることを追加すると思いました。

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

これを自分で理解するのに少し時間がかかりました-うまくいけば、同じ問題を抱えているこの質問に来る他の誰かに役立つことを願っています.

于 2016-08-03T18:29:33.433 に答える