0

定義された属性に基づいてモデルのレコードを選択したいと考えています。

私はドケットモデルを持っています。ドケットには多くのステータスがあります。(ステータス変更の履歴と各ステータス変更に関するいくつかのメタデータを維持するために、各ステータス変更を記録したいと考えています。) 各ステータスには code 属性があります。

各 Docket には定義された属性があります: currentstatus (self.Statuses.last.code)。currentstatus == 1 の Dockets をすべて選択したいのですが、属性が定義されているため Dockets.where(:currentstatus => 1) は使えません。

助けてくれてありがとう。

4

4 に答える 4

1

doket.rbで named_scopeを使用できます。

named_scope :find_by_currentstatus, lambda {|currentstatus| 
  {:conditions => {:currentstatus => 1}}
}
于 2013-02-12T13:34:53.177 に答える
1

あなたはSQLアプローチを試すことができます

Docket.where('(SELECT statuses.currentstatus FROM statuses WHERE statuses.docket_id = dockets.id ORDER BY statuses.created_at DESC LIMIT 1) = ?', 1)
于 2013-02-12T13:46:56.783 に答える
0

これを試して:

Docket.joins(:statuses).where("statuses.currentstatus = 1")

アップデート

次のことを試してください。

Docket.includes(:statuses).where("(statuses.id = (select max(statuses2.id) from statuses statuses2 where statuses2.docket_id = dockets.id)) AND (statuses.currenstatus = 1)")
于 2013-02-12T13:21:46.947 に答える
0

非常に醜いオプションが 2 つと、少し扱いに​​くいオプションが 1 つしかないため、これはトリッキーです。

a) すべてをロードし、メモリ内でフィルタリングします (そうしないでください!)

b) メソッド内のロジックをcurrent_statusSQL クエリに変換し、current_statusメソッドとメソッドでロジックを複製しますsearch_for_current_status

c) データを複製します (つまり、 current_status が変更されたときに Docket にフラグを設定し、それを使用してクエリを実行できますwhere

a は絶対に行わないでください - current_status メソッドが単純なものである場合は b を検討してください (このように Docket モデルのスコープ メソッドで定義できます)。

class Docket < ActiveRecord::Base
  def self.open
    # so some magic here with joins on the statuses table
  end
end

c は基本的に、クエリ目的でのデータの非正規化です。それを元のモデルに入れるか、特別なテーブルを作成することができます(cronジョブまたはその他のトリガーを介してそのテーブルを自動的に更新することもできます-StatusモデルのActiveRecord after_saveコールバックかもしれません)

于 2013-02-12T13:22:00.557 に答える