2013-07-29 41 views
0

我有一個名爲Materials的表,我創建了一個搜索表單。在表單中,我希望有包含搜索選項名稱的選擇框。舉例來說,如果您想按主題搜索,我希望每個主題都有一個下拉菜單。我對這個代碼的工作原理:從Rails數組中過濾nil和空值3.2

@subject = Material.unscoped.select(:subject).where("materials.subject IS NOT NULL 
and materials.subject != '' ").uniq 

這給了我什麼,我想用下面的表單輔助:

<%= select_tag "subject", options_from_collection_for_select(@subject, "subject", 
"subject"), :include_blank => true, :class => "input_field" %> 

但是 - 我現在只想選擇從共享材料的主題。所以,我選擇的共享使用的材料:

@shared = Material.where(:status => 'shared') 

然後跑到這段代碼:

@subject = @shared.unscoped.select(:subject).where("@shared.subject IS NOT NULL 
and @shared.subject != '' ").uniq 

不工作。我認爲這是因爲sql代碼無法理解@shared對象。但如何做到這一點?

注:

我試着使用:

@subject = @shared.uniq.pluck(:subject).reject! { |s| s.empty? } 

這給正確的字段的數組,但隨後不與options_from_collection_for_select工作。

回答

1

可以爲shared這樣的查詢創建範圍:

scope :shared, where(:status => 'shared') 

然後您就可以鏈ActiveRecord方法,根據自己的喜好:

@subject = Material.select(:subject).where("materials.subject IS NOT NULL 
    AND materials.subject != '' ").shared.uniq 

有關範圍的更多信息,請訪問:http://guides.rubyonrails.org/active_record_querying.html#scopes

+0

謝謝。這也起作用,範圍界定對其他事情也很有用。 – Finnjon

1

試試這個

+0

謝謝。這工作! – Finnjon