0

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はArrayのメソッドではないと文句を言います。

しかし、私には別のスコープがあります、

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

動作しますが、DRY(個々のスコープも必要なので)やRailsっぽくはありません。ここや他の場所を検索すると、同様の質問が表示されますが、パラメーターを使用して2つのラムダをチェーンしようとしているこの状況に当てはまると思われる質問はありません。

4

1 に答える 1

5

それはあなたのスコープで起こるので

scope :by_status, lambda { |status| if status == "All" then WorkRequest.all else WorkRequest.find_all_by_status(status) end }

の代わりにメトッドallfind_all_by_statusリターン。たとえば、に置き換える必要があります。ArrayActiveRecord::Relationwhere

scope :by_status, lambda { |status| where(:status => status) unless status == "All" }
于 2012-10-02T20:16:59.980 に答える