Rails 3.2:ラムダスコープチェーン?
-
12-12-2019 - |
質問
私のRailsの中で3.2.8アプリはいくつかの状況で一緒に連鎖したいという名前のスコープを持っています。
だから、私はこれら2つのスコープを持っています:
scope :by_status, lambda { |status| if status == "All" then WorkRequest.all else WorkRequest.find_all_by_status(status) end }
scope :in_date_range, lambda { |start_date, end_date| includes([:person, :pier_module]).where("(status_date >= ?) AND (status_date <= ?)", start_date, end_date) }
.
私はそれらを別々に使いますが、私はそれらをこのように一緒に呼び出すことができるようにしたいです:
WorkRequest.by_status("Accepted").in_date_range("2012-01-01", "2012-10-02")
.
IN_DATE_RANGEが配列のメソッドではないことをコンサルするように試しているとき。
しかし私は別の範囲を持っています、
scope :active, includes([:person, :pier_module]).where("status = 'New Request'")
.
と私がしたら
WorkRequest.active.in_date_range("2012-01-01", "2012-10-02")
.
うまくいきます!どうやらアクティブなスコープは関係を返しますが、ラムダはアレイを獲得しますが、チェーンされることはできません。
シンプルなスコープとラムダのスコープの違い、パラメータがどのように影響するか、そして私がした複合範囲を書くことができるかどうかを知るのが大好きです。
scope :by_status_in_date_range, lambda { |status, start_date, end_date| includes([:person, :pier_module]).where("(status = ?) AND (status_date >= ?) AND (status_date <= ?)", status, start_date, end_date) }
.
は、(個々のスコープも必要なので)やすくない(個々のスコープが必要なので)またはRails-ish。ここでさらに検索しています。私は同様の質問を見ましたが、それはこの状況に適用されているようです。
解決
あなたの範囲で起こる
scope :by_status, lambda { |status| if status == "All" then WorkRequest.all else WorkRequest.find_all_by_status(status) end }
.
Metods all
とfind_all_by_status
は、Array
の代わりにActiveRecord::Relation
を返します。たとえば、where
と置き換える必要があります。
scope :by_status, lambda { |status| where(:status => status) unless status == "All" }
. 所属していません StackOverflow