1

このコードは正常に動作しますが、私はそれを見て、よりクリーンになる可能性があると考えています。おそらく、これを行うためのより慣用的なルビー/レールの方法がありますか? member_of スコープは最後に、ページネーション (スコープではなくコレクションを返す) の前に来る必要があるため、順序は重要です。

これの利点の 1 つは、何が起こっているのかが非常に明確であることです。

@locations = Location.send(params[:type]) if type_sent_and_valid? #refine to a particular type if present
@locations = (@locations || Location.locatable).near(latlng_params) if latlng_sent? #refine to location

@locations = (@locations || Location).member_of(@interest_group.id).paginate(:page=>params[:page], :per_page=>20)

これは、params 文字列が次のようなものである場合:

?lat=50&lng=150&type=restaurant&page=1

次に、これを生成する必要があります

Location.restaurant.near([50.0,150.0]).member_of(@interest_group).paginate(:page=>1, :per_page=>20)
4

1 に答える 1

2

これをきれいにする 1 つの方法は、同じ変数を使用して一度に 1 ステップずつスコープを移動するスライディング スコープ メカニズムを使用することです。

location_scope = Location

if (type_sent_and_valid?)
  location_scope = location_scope.send(params[:type])
end

if (latlng_sent?)
  location_scope = location_scope.locatable.near(latlng_params)
end

location_scope = location_scope.member_of(@interest_group.id)

@locations = location_scope.paginate(:page=>params[:page], :per_page=>20)

必要に応じて他の条件を追加できます。

于 2011-05-04T17:53:48.720 に答える