2013-03-05 85 views
1

我有一個「Projects」的基本模型,它目前只有屬性name:string,active:boolean。在索引視圖中,我希望能夠有三個鏈接:活動項目,非活動項目和所有項目。這些鏈接將根據活動布爾值的狀態顯示適當的項目。起初,我成立了看法給予鏈接PARAMS,如:Rails:排序和篩選基於布爾屬性的數據

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 

這似乎有點麻煩,尤其是在未來,我希望有多個過濾器,像到期日和客戶。實現高級排序/篩選操作的好方法/寶石是什麼,而不是用很多代碼填充控制器?

+1

https://github.com/ern即/ ransack是一個偉大的過濾寶石。 – deefour 2013-03-05 16:19:09

回答

1

你可以構建你的參數作爲散列,並將其傳遞給條件:

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

filters = params[:filters] 
@projects = Project.where(filters) 
+0

這看起來不錯。謝謝。 – dremme 2013-03-05 16:31:34

0

我會建議使用where語句。也這是你的代碼重構:

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

然後你就可以保持堆放物品上是否存在像這樣的附加PARAMS:

@projects = @projects.where(awesome_sauce: params[:awesome_sauce]) if params[:awesome_sauce].present?