3

私はこれをしばらく探していましたが、答えが見つからないようです。ただし、私よりも Rails の経験が豊富な場合は、かなり簡単に修正できるはずです。製品モデルに複数の default_scope 条件を追加しようとしています。私の製品モデルファイルは次のとおりです。

class Product < ApplicationRecord
    has_many :order_items
    default_scope { where(active: true) }
    validates :name,  presence: true, length: { maximum: 300 }
    PRICE_REGEXP = /\A\d{1,4}(\.\d{0,2})?\z/
    validates :price, presence: true,
                      numericality: true,
                      format: { with: PRICE_REGEXP }
    validates :description, presence: true, length: { maximum: 1000 }, 
                            allow_nil: true
end

私も追加したいと思います

default_scope -> { order(created_at: desc) }

製品インデックス ページの新製品が新しいものから順に表示されるようにします。次のようなことを行うたびに、構文エラー メッセージが表示されます。

default_scope -> { order(created_at: desc) }, { where(active: true) }

また

default_scope -> { order(created_at: desc), where(active: true) }

また

default_scope -> { order(created_at: desc) where(active: true) }

これはおそらく、私が理解していない単なる構文であることを知っています。これを修正する方法について誰かが私にアドバイスをくれるなら、それは大歓迎です! ありがとう!

4

1 に答える 1

7

あなたがやろうとしていることはこれだと思います

default_scope -> { where(active: true).order(created_at: :desc)  }

事実上、構文の問題が発生しました。彼らが新しいラムダスコープ構文を Railsに追加したとき、多くの Ruby 開発者にとって、その関数型プログラミングの起源のため、少しなじみがありませんでした (Rails がオブジェクト指向言語であることを考えると)。事実上、コードのセグメントは{}ブロックのように機能し、内部のコードを実行します。このwhere句は、スコープが宣言されているモデルで暗黙的に呼び出されます。そのwhere句は、渡された属性によってリレーション内のレコードをソートするメソッドActiveRecordを実装するリレーション オブジェクト (データベース レコードのコレクション) を返します (この渡されorderたパラメータに基づいて、created_at降順 ( desc) または昇順 ( ) で表されます。asc

于 2016-10-19T20:44:06.147 に答える