2

ユーザー入力をクエリに変換するためのapplication_controllerのコードを書くと、これは機能します。

result_set =  model  # some implementation of ActiveRecord::Base as a Class
.includes(:metric_template => [:group]) #still need to abstract this
.where(f)  
.order(sort_string)
.limit(rows)
.offset((page-1)*rows)

whereメソッドが呼び出されていないように見えるため、これは機能しません。

result_set =  model
.includes(:metric_template => [:group])  #still need to abstact this
.tap{|o| o.where(f) if f}
.order(sort_string)
.limit(rows)
.offset((page-1)*rows)

ここで.tap()を機能させたいのですが。なんでそうじゃないの?クラスメソッドとして利用できませんか?納得できますか?

ガイダンスに感謝します。

4

2 に答える 2

2

whereうまく呼ばれます。問題は、where目に見える副作用がないことです。これは、戻り値にのみ使用されます。

tapブロックの戻り値には何もしないのでtap、目に見える副作用がないブロックで使用しても意味がありません。

于 2012-07-10T01:10:10.447 に答える
1

これがあなたが(効果的に)欲しいものです:

result_set = model.
  includes(:metric_template => [:group]).  #still need to abstact this
  order(sort_string).
  limit(rows).
  offset((page-1)*rows)
result_set = result_set.where(f) if f

これは、実際にはを必要とする状況ではありません。これはtap、メソッドの戻り値を変更せずにメソッド内のアイテムを操作する場合に最も役立ちます(sepp2kが説明した理由により)。

また、このクエリをモデル内のメソッドに移動するのがおそらく最善でしょう。

于 2012-07-10T02:41:13.307 に答える