質問

私の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 allfind_all_by_statusは、Arrayの代わりにActiveRecord::Relationを返します。たとえば、whereと置き換える必要があります。

scope :by_status, lambda { |status| where(:status => status) unless status == "All" }
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top