1

私はしばらくの間これを探していましたが、回答が見つからないように見えましたが、Railsでもっと経験があればかなり簡単に修正できるはずです。製品モデルに複数のdefault_scope条件を追加しようとしています。次のように私の製品モデルファイルは次のとおりです。複数の条件をRailsスコープに追加するにはどうすればよいですか?

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) } 

私は、これはおそらく、私はありませんだけで、構文のものであることを知っています理解。もし誰かが私にこれを修正する方法のアドバイスを与えることができれば大いに感謝します!ありがとう!

答えて

2

は、私が何をやろうとしていることは、あなただけの構文の問題を持っていたので、効果的にこの

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

だと思います。新しいlambdaの範囲構文をレールに追加したとき、機能プログラミングの起源のために、多くのRuby開発者にはあまり馴染みがありませんでした(レールはオブジェクト指向言語です)。効果的に{}のコードセグメントはブロックのように動作し、コードを内部で実行します。 where句は、スコープが宣言されたモデルで暗黙的に呼び出されます。where句は、orderメソッドを実装するActiveRecordリレーションオブジェクト(データベースレコードのコレクション)を返します。このメソッドは、渡されたパラメータに基づいて降順(desc)または昇順(asc)の順に(この場合はcreated_at)渡されました。

+0

なぜそれが機能するかを説明すると、これがより良い回答になります。 – max

+0

あなたは私にそれをさせてください –

+0

私は、考えを更新しましたか? –

関連する問題