你看起來缺少的是一個參數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
希望這有助於!
駕駛的downvoters ...爲什麼這個答案不被認爲是有幫助的? – Kingdon
謝謝,不容易找到有關...的'.filterrific_find(@filteriffic)'......的文檔......必須從源代碼中推演出來,然後我發現這個問題和答案! –
謝謝!一開始我就很難弄清楚,但是一旦我理解了如何正確運用,它就變得非常強大。後知後覺地讀了一下這讓我感到震驚,因爲我確實把它全部弄清楚了。 – Kingdon