1. ホーム
  2. ruby-on-rails

[解決済み] Rails 4のhas_manyとorderの非推奨の警告

2022-10-10 03:59:43

質問

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の宣言で非推奨です。 RelatedList.has_many :contents宣言の次のオプションは非推奨です: :order. 代わりにスコープブロックを使用してください。たとえば、次のようになります: has_many :spam_comments, conditions: { spam: true }, class_name: 'コメント'. は次のように書き換えてください。 has_many :spam_comments, -> {。 where spam: true }, class_name: 'コメント'. . (call from at /Users/shivam/Code/auroville/avorg/app/models/related_list.rb:7).

Rails 4にはモデルで使う新しい:order構文があるようですが、Rails Guidesにドキュメントがないようです。

どのように解決するのですか?

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

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

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

注文の方向を指定する場合、つまり、どちらかの asc または desc を、@joshua-coady や @wsprujit が提案しているように、使ってみてください。

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

または、ハッシュ形式を使用します。

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

さらに参考として のアクティブレコードのスコープ has_many .