2016-12-24 72 views
3

我終於得到了我的filterrific得到工作,它的一個偉大的寶石,如果不是像我這樣的一個小複雜。如何通過默認篩選器Filterrific得到

我原來的索引頁,在過濾基於這些活動記錄附近的用戶是這樣的:

def index 

location_ids = Location.near([session[:latitude], session[:longitude]], 50, order: '').pluck(:id) 
@vendor_locations = VendorLocation.includes(:location).where(location_id: location_ids) 

@appointments = Appointment.includes(:vendor). 
    where(vendor_id: @vendor_locations.select(:vendor_id)) 

end 

所以這個提取所有與該地區供應商的約會,但我要如何通過這個到了Filterrific搜索:

@filterrific = initialize_filterrific(
    params[:filterrific], 
    select_options:{ sorted_by: Appointment.options_for_sorted_by, with_service_id: Service.options_for_select }, 
) or return 

@appointments = @filterrific.find.page(params[:page]) 

respond_to do |format| 
    format.html 
    format.js 
end 

這似乎是Filterrerrific加載所有的約會默認的,但我想限制到附近的人。我錯過了什麼?

回答

2

你看起來缺少的是一個參數default_filter_params來過濾模型中的宏。 (你的問題沒有提到你對VendorLocation模型作了任何調整,因爲那是你想要過濾的對象,也就是應該調用宏的地方,也許你只是從你的問題中省略了它......)

the model docs

filterrific(
    default_filter_params: { sorted_by: 'created_at_desc' }, 
    available_filters: [ 
     :sorted_by, 
     :search_query, 
     :with_country_id, 
     :with_created_at_gte 
    ] 
) 

您可能發現了這個已經,這是文檔的第一頁上,但有好需要的(我就遇到了這個太示例應用程序更重要的東西,當我最近剛剛使用了Filterrific)

首頁上的信息是不足以真正讓你開始。 您必須進一步閱讀以查看可能需要更改模型,模型訪問和視圖以支持Filterrific的其他方式。

,使過濾器的默認設置有效的部分是這個default_filter_params哈希(NOT select_options,它提供了「選擇」又名下拉框的選項。這不是你想要的東西可言,除非你做一個下拉列表過濾器。 )該散列保存默認情況下需要應用的作用域列表(散列鍵),並將作用域參數用作散列值。

default_filter_params哈希可能不是你唯一缺少的......你還必須定義要在模型中使用的那些ActiveRecord的範圍爲每個過濾器,並命名這些在如上所述available_filters讓他們提供給filterrific:

scope :with_created_at_gte, lambda { |ref_date| 
    where('created_at >= ?', ref_date) 
end 

重要的是,這些領域都需要一個參數(值來自濾波器領域的視圖頁上的價值,即使你想保持他們隱藏你必須添加這些到您的視圖用戶)。他們總是返回ActiveRecord關聯也很重要。

這更像是你想要什麼:

scope :location_near, lambda { |location_string| 
    l = Location.near(location_string).pluck(:id) 
    where(location_id: l) 
end 

這種方法的問題是,在你的情況下,沒有location_string或任何單個位置的變量,你有你的位置參數的多個座標。但你不是第一個有這個問題的人!

This issue描述了您準備解決的問題。Filterrific筆者建議嵌入位置字段到隱藏的表單字段嵌套fields_for,這樣的形式仍然可以(在with_distance_fields爲)傳遞一個參數到範圍:

<%= f.fields_for :with_distance do |with_distance_fields| %> 
    <%= with_distance_fields.hidden_field :lat, value: current_user.lat %> 
    <%= with_distance_fields.hidden_field :lng, value: current_user.lng %> 
    <%= with_distance_fields.select :distance_in_meters, 
    @filterrific.select_options[:with_distance] %> 
<% end %> 

...做出的改變在你看來,並添加一個匹配範圍,看起來像(從鏈接GitHub的問題複製):

scope :with_distance, -> (with_distance_attrs) { 
    ['lng' => '-123', 'lat' => '49', 'distance_in_meters' => '2000'] 
    where(%{ 
    ST_DWithin(
     ST_GeographyFromText(
     'SRID=4326;POINT(' || courses.lng || ' ' || courses.lat || ')' 
    ), 
     ST_GeographyFromText('SRID=4326;POINT(%f %f)'), 
     %d 
    ) 
    } % [with_distance_attrs['lng'], with_distance_attrs['lat'], with_distance_attrs['distance_in_meters']]) 
} 

所以,:with_distance範圍應該去到VendorLocation模型,它或許應該是這樣的:

scope :with_distance, -> (with_distance_attrs) { 
    lat = with_distance_attrs['lat'] 
    lng = with_distance_attrs['lng'] 
    dist = with_distance_attrs['distance'] 
    location_ids = Location.near([lat, lng], dist, order: '').pluck(:id) 
    where(location_id: location_ids) 
end 

最後但並非最不重要的,你可能會注意到,我刪除您的來電includes(:location) —我知道你把它放在那裏故意的,我沒有發現它在文檔中很清楚,但你仍然可以得到渴望裝載有ActiveRecord的優化到一個查詢冒充過濾工作Filterrific通過這種方式定義您的控制器的指數方法之前:

def index 
    @appointments = Appointment.includes(:vendor). 
    filterrific_find(@filterrific).page(params[:page]) 
end 

希望這有助於!

+0

駕駛的downvoters ...爲什麼這個答案不被認爲是有幫助的? – Kingdon

+1

謝謝,不容易找到有關...的'.filterrific_find(@filteriffic)'......的文檔......必須從源代碼中推演出來,然後我發現這個問題和答案! –

+0

謝謝!一開始我就很難弄清楚,但是一旦我理解了如何正確運用,它就變得非常強大。後知後覺地讀了一下這讓我感到震驚,因爲我確實把它全部弄清楚了。 – Kingdon