2016-08-22 6 views
0

私はレールアプリケーションを持っており、今日作成されたすべての注文を照会する今日の範囲を持つ注文モデルを持っています。Rails4:モデルスコープを編集するたびにコンソールを再起動する必要があるのはなぜですか?

アプリ/モデル/ order.rb

scope :today, -> { where("created_at >= ?", Time.current.in_time_zone("Zone").beginning_of_day) } 

と私は、この範囲にいくつかの機能を追加し、それを編集することを決めたまでそれはコンソールに罰金働いていた...

scope :today, -> { where("shift_id = ? AND created_at >= ?", 1, Time.current.in_time_zone("Zone").beginning_of_day) } 

とこの編集をテストするためにコンソールに戻ったときに保存されたコンソールは、編集前と同じ結果を与え続けました。私がRails Consoleを再起動するまで。

なぜこの現象が発生するのですか?それは、生産時にアプリケーションのパフォーマンスや動作に影響すると考えました。

また、私は、このスコープを2つのスコープに分割してスコープチェーンを使用する方がパフォーマンスが優れていると思いましたか?

+0

Re:性能連鎖はあまり効果的ではありませんが、より重要なのは、メンテナンス性が最適化されていることです。これは高価です。ほとんどの場合、変更、テスト、理解するのが簡単です。 – coreyward

答えて

1

reload!をコンソールに使用できます。ただし、既存のオブジェクトは更新されません。あなたは既にやったのであれば:

foo = Foo.find_by(id: 12) 

reload!は、クラスの定義を再ロードしますしながら、あなたが手に持っているインスタンスは変更されません。そのオブジェクトの新しいインスタンスを取得する必要があります。

コンソールでreload!を使用してモデル定義をリロードしてから、属性や動作の変更を確認するためにfooオブジェクトの新しいインスタンスを取得します。

0

まず、私はそれがなぜ起こるか答えてください。開発環境では、スプリングを有効にして変更をリロードし、Webサーバーに反映させます。しかし、コンソールを実行すると、コンソールだけではなくWebサーバーが稼働しないので、変更するたびにコンソールをリロードする必要があります。

第2に、リロードしなかったという理由だけで、コードの効率が悪いということです。私はあなたが開発の初期段階にあり、可読性と保守性が最優先であると信じています。その視点では、あなたのコードは私にとってかなり良いようです。

関連する問題