2015-05-14 87 views
3

嗨,大家好,我對Ruby on Rails非常陌生,我正在製作一個簡單的資源應用程序。該應用程序有三個主要類別(課程,年,資源類型)的過濾器可能會或可能不存在。這些過濾器通過URL中的參數傳遞。我將這些參數存儲在稱爲課程,年份,資源類型的3個數組中。但是有時候這個數組可能是空的。當我試圖運行一個空數組的搜索(例如,也許resourceType爲空,所以我想從特定年份的特定資源,但它可以是任何類型),它會返回一個空集。有沒有辦法在這個函數中使用通配符?如果沒有,有人可以提出合適的解決方案任何幫助將不勝感激Ruby on Rails ActiveRecord如何讓where子句總是評估爲真

這是我試圖運行的功能。

 @resources= Resource.where(class_name: courses, 
          year: years, 
          resource_type: resourceTypes) 
          .paginate(page: params[:page], per_page: 10) 
          .order(:cached_votes_total => :desc) 

回答

0

嘗試:

query = { } 

query[:class_name] = courses if courses.present? 
query[:year] = years if years.present? 
query[:resource_type] = coursresourceTypeses if coursresourceTypeses.present? 

@resources = Resource.where(query).paginate(page: params[:page], per_page: 10).order(cached_votes_total: :desc) 
+0

賓果!我們有一個贏家!我不知道有可能將一個對象傳遞給ActiveRecord。謝啦! –

+0

Kyle的解決方案不會運行多個查詢(除非粘貼到控制檯會話中 - irb/pry調用中間關係檢查會觸發db查詢) –

+0

ops抱歉。只是編輯了答案。 –

3

你總是可以這樣做:

@resources = Resource.all 
@resources = @resources.where(class_name: courses) if courses.any? 
@resources = @resources.where(resource_type: resourceTypes) if resourceTypes.any? 
@resources = @resources.where(year: years) if years.any? 
@resources = @resources.paginate(page: params[:page], per_page: 10).order(:cached_votes_total => :desc)