0

私の見解では、モデルで定義された非常に複雑なメソッドがあります。

  def self.current_rating(recommendation_id, rating_set, product_id)
    if !Recommendation.find(recommendation_id).ratings.find_by_rating_set(rating_set).nil?
      Recommendation.find(recommendation_id).ratings.find_by_rating_set(rating_set).rating.to_i
    elsif  !Recommendation.find(recommendation_id).ratings.find_by_product_id(product_id).nil?
      Recommendation.find(recommendation_id).ratings.find_by_product_id(product_id).rating.to_i
    else
    end
  end

そして私の見解では、私は次のように呼びます。

:selected => Rating.current_rating(rec.id,params[:rating_set_id], params[:product_id])

私のselect_tag

基本的に、最初の検索から何かが返されるかどうnilか、2番目の検索から何かが返されるかどうか、そしてそれが何も返されないかどうかを確認したいと思いnilます。これをより良い/より構文的にするためにどのようにリファクタリングできますか?

4

2 に答える 2

0
def self.current_rating(recommendation_id, rating_set, product_id)
    r = Recommendation.find(recommendation_id).ratings
    x = r.find_by_rating_set(rating_set) || r.find_by_product_id(product_id)
    x && x.rating.to_i
end

したがって、すべての表現は、レコIDに基づいて推奨事項を見つけ、その評価を取得することから始まることに気付きました。だから私は最初にそれを行い、に割り当てrます。

次に、rating_setで検索しようとしますが、失敗した場合(nilが返されます)、製品IDでの検索に短絡します。それが失敗した場合(nil)、xはnilになります。

Rating_setまたはproductidのどちらで検索する場合でも、どちらにも評価方法があります。したがって、xがnil(x &&)でない場合は、ratingを呼び出してから、to_iを呼び出します。最後の式なので返されます。

xがnilの場合、(nil &&whatever)の結果が返されます。これはnilです。

于 2013-03-19T04:12:29.623 に答える
0

いろいろなことができます。あなたのアプリケーションについて多くを知らなくても、ここに私がお勧めするものがあります:

これのすべてのステップにはが含まれますRecommendation.find(recommendation_id)。これにより、これをモデルのインスタンスメソッドにしたいRecommendationので、4つの同一の推奨ルックアップを実行する可能性はありません。

このメソッドの最初の行は、推奨から必要な評価を取得します。何かが見つからない限り、rating変数は残ります。nil

def current_rating(rating_set, product_id)
  ratings.find_by_rating_set(rating_set) || ratings.find_by_product_id(product_id)
end

ratingこれで、またはを返すメソッドが残りますnil。これで何をするつもりなのかわからないので、次に何をすべきかはわかりませんが、この方法は意図が明確で、少なくともある程度はあるので、この状況の全体的な戦略としてはより良いと思います。その出力で予測可能です(current_ratingメソッドを呼び出して、Ratingオブジェクトの代わりに整数を受け取った場合は少し心配になります)。これを使用して評価の番号をビューに表示している場合、これはデコレータまたはその他のパタ​​ーンの候補として適しています。

于 2013-03-19T04:22:50.117 に答える