私はしばらくこれを探していて、答えを見つけることができないようですが、私よりも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) }
これはおそらく私が理解していない構文上の問題であることを私は知っています。誰かがこれを修正する方法について私にアドバイスを与えることができれば、それは大いにありがたいです!ありがとう!
あなたがやろうとしているのはこれだと思います
default_scope -> { where(active: true).order(created_at: :desc) }
つまり、事実上、構文の問題が発生しただけです。彼らが新しいラムダスコープ構文をrailsに追加したとき、関数型プログラミングの起源のために、多くのRuby開発者には少し馴染みがありませんでした(与えられたrailsはオブジェクト指向言語です)。事実上、コードのセグメントは{}
ブロックのように機能し、内部のコードを実行します。このwhere
句は、スコープが宣言されているモデルで暗黙的に呼び出されwhere
ます。この句は、渡された属性によってリレーション内のレコードを並べ替えるメソッドActiveRecord
を実装するリレーションオブジェクト(つまり、データベースレコードのコレクション)を返します。order
ケースcreated_at
)は、渡されたパラメータに基づいて降順(desc
)または昇順(asc
)になります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加