1

私は「プロジェクト」の基本モデルを持っていますが、現在、属性はname:string、active:booleanのみです。インデックスビューで、アクティブプロジェクト、非アクティブプロジェクト、およびすべてのプロジェクトの3つのリンクを作成できるようにしたいと思います。これらのリンクは、:activeboolean値のステータスに基づいて適切なプロジェクトを表示します。最初に、次のようなリンクパラメータを指定してビューを設定しました。

link_to "Active Projects", {:action => 'index', :active => true}

次に、コントローラーで:

if params[:active] == "true"
  @projects = Project.find(:all, :conditions => {:active => true})
elsif params[:active] == "false"
  @projects = Project.find(:all, :conditions => {:active => false})
else
  @projects = Project.all

これは少し面倒なようです。特に、将来的には期日やクライアントなどの複数のフィルターが必要になるためです。コントローラーを大量のコードでいっぱいにすることなく、高度な並べ替え/フィルタリングアクションを実装するための良い方法/宝石は何ですか?

4

2 に答える 2

1

パラメータをハッシュとして構造化し、それを条件に渡すことができます。

# example:
params = {
  :filters => {
    :active => true,
    :name => 'Boby',
    # etc...
  }
}

filters = params[:filters]
@projects = Project.where(filters)
于 2013-03-05T16:25:49.460 に答える
0

ステートメントを使用することをお勧めしwhereます。また、ここにリファクタリングされたコードがあります:

@projects = Project.all
@projects = @projects.where(active: params[:active]) if params[:active].present?

次に、次のように追加のパラメータが存在する場合は、アイテムを積み重ね続けることができます。

@projects = @projects.where(awesome_sauce: params[:awesome_sauce]) if params[:awesome_sauce].present?
于 2013-03-05T16:24:14.357 に答える