0

それを可能にする機能があるかどうか疑問に思っています:

MyModel.find_by_conditon(メソッド a - メソッド b > 0)

MyModel.class

def method_a
  next_service_date.to_i
終わり

def method_b
  last_service_date.to_i
終わり
def next_service_date
  service_date.present? ? Calculate_time_estimation : row_time_estimation
終わり
def 計算された_時間_推定
  service_date + 計算された_service_period
終わり
デフォルト計算された_サービス_期間
      case(サービス_頻度_期間)
      「年」の場合
        service_frequency_number.to_i.year
      「月」の場合
        service_frequency_number.to_i.month
      「週」の場合
        サービス頻度数.to_i.day * 7
      いつ「日」
        service_frequency_number.to_i.day
      終わり
終わり

service_frequency_numberservice_frequency_periodservice_dateMyModel の属性

4

2 に答える 2

1

method_aとが実際に属性であると仮定するとmethod_b、次のことができます。

MyModel.where('method_a - method_b > ?', 0)

編集

計算フィールドに対してクエリを実行できるようにする唯一の方法は、結果を返すスカラー関数を持つ DB に計算を移動することだと思います。その後、行うことができますMyModel.where('next_service_date_on_db(service_date) > 0')。残念ながら、それでは DB 固有の実装に縛られることになりますが、サーバー側の機能がなければその方法でクエリを実行することはできません。

コレクション全体がある場合は、これらの条件に基づいてフィルタリングできますが、セット全体をロードする必要があります。例えば:

MyModel.all.select {|m| m.method_a - m.method_b > 0}

#allすべてのオブジェクトの配列を返し、ブロックの状態に基づいてフィルターを選択します。残念ながら、このソリューションはすべてのレコードをロードしてアプリケーション側をソートします。

于 2012-12-10T05:23:44.613 に答える
0

何を達成しようとしているのか完全にはわかりません..しかし、SQLに頼る必要があるかもしれませんか?

(そして、method_a と b は何ですか?)

MyModel.where('? > 0', (method_a - method_b))
于 2012-12-10T05:20:56.083 に答える