2016-03-24 39 views
0

Temel olarak indeks eyleminin üstünde yer alan bir filtre oluşturmaya çalışıyorum. Buradaki fikir, bir kullanıcının belirli bir özellik kümesini kontrol edebilmesidir (diğerlerine önem vermediği özellikler için başkaları tarafından kontrol edilmeden bırakılır). Gönderdikten sonra sonuç, bu özniteliklere uyan tüm öğelerle (işaretlenmemiş öznitelikler göz ardı edilirken) geri gelmelidir.Filtreleme Sonuçları - Ruby on Rails

Bunun nasıl yapılacağı konusunda çeşitli yerlerde bir kod parçası gördüm. Ancak, bu formu ve bu formla ilişkili denetleyici eylemini nasıl oluşturacağınızı gösteren hiçbir şey görmedim. Ayrıca, çoğu zaman onay kutularını kullanmaya çalışacağım ve bunu yapan pek çok örnek görmedim.

Şimdiye dek sahip olduğum şeyin bir örneği. : manhattan_served ve: brooklyn_served özelliklerin sadece 2 örneğidir. Kullanıcıların bir seferde bu özelliklerin 5 veya 6'sını kontrol edebileceği 20 gibi bir şey olmasını umuyorum.

İşte /app/views/experts/filtered_experts.html.erb

<%= form_tag filtered_experts_path, method: :get do %> 
    <%= label_tag(:manhattan_served, "Serves Manhattan") %> 
    <%= check_box_tag :manhattan_served, true%> 

    <%= label_tag(:brooklyn_served, "Serves Brooklyn") %> 
    <%= check_box_tag :brooklyn_served, true%> 

<%= submit_tag "Filter", name: nil %> 
<% end %> 

benim denetleyicisi yanı da bu

/app/controllers/experts_controller.rb

def filtered_experts 
     @experts = Expert.where(params[filtering_params]) 
    end 

private 

    def filtering_params 
     params.slice(:manhattan_served, :brooklyn_served) 
    end 

Sağ şimdi, gönderdiğimde, her zaman tam listeyi iade ediyorum. Benim raylar sunucu günlüğüne baktığımızda, bu denetleyiciye geçirilen oluyor gibi görünüyor:

Processing by ExpertsController#filtered_experts as HTML 
    Parameters: {"utf8"=>"✓", "manhattan_served"=>"true", "brooklyn_served"=>"true"} 

bu sadece bana Brooklyn ve Manhattan hizmet sadece uzmanlar değil dönmek konusunda herhangi bir fikriniz?

Teşekkürler! Ben, gerçi size o olabilir

cevap

0

Sana filtreleme gerçekleştirmek istediğiniz şeyi tamamen emin değilim, bu yüzden alternatif olarak önermek emin değilim ... nedeni böylece filtering_params() çağrısı {dönüyor, raylar içinde

params[filtering_params] 

Hash.slice sadece belirtilen tuşlarıyla karma bir kopyasını döndürür:: hepsi sonuç görmeye ediyorlar çünkü biridir manhattan_served => true, : brooklyn_served => true}.

@experts = Expert.where(params[filtering_params]) 

gelen esrar araması açıkça başarısız olduğundan, nil döndürür: Daha sonra yapmanız karma anahtar olarak bu kullanıyoruz.

SELECT * from experts WHERE 1=1; 

Sadece bu çağrıyı değiştirerek bu bir durumda çözebilirsiniz: Eğer nil ile .Where() çağrısı, bu yapmak gibi

@experts = Expert.where(filtering_params) 

Ama diğer içine edeceğiz şüpheli Daha sonra filtrelediğiniz/değiştirdiğiniz param sayılarına bağlı olarak problemler. Adlandırılmış kapsamları incelemenizi tavsiye ederim. Bir AR ilişkisi kurabilmek için onları bir araya getirebilirsiniz ve çoğu zaman bu problemlerin bazılarını nasıl çözer?

http://guides.rubyonrails.org/active_record_querying.html#scopes

+0

sayesinde, bu yüzden de kapsamları ile bunu yapmaya içinde bakıyordu. Yaptığım şey, kapsamı çağırmak için form_tag'den gelen bilgileri denetleyiciye nasıl ileteceğiydi.Kontrolör nasıl görünmeli? Mesela benim modelimde kapsam olarak: manhattan_served, -> {nerede (manhattan_served: true)} kapsamı: brooklyn_served, -> {where (brooklyn_served: true)}. Bir kullanıcı sadece Manhattan kutusunu kontrol ederse, kontrolörün neye benzemesi gerekir ki, sadece Manhattan alanını değil, Brooklyn'i mi çağırsın? –

+0

Eğer böyle bir şey için bu kapsam tanımları değiştirirseniz: 'kapsamı: manhattan_served, -> (manhattan_served) {yerleri ("GİBİ manhattan_served?" Manhattan_served || = '%')' Ardından araya zincirleyin edebilirsiniz denetleyiciniz: 'Expert.manhattan_served (params [: manhattan_served]). brooklyn_served (params [: brooklyn_served])' Değer sağlamadığınız takdirde '% LIKE' etkisi joker karakterdir. Yani bu paramlardan biri 'sıfır' olarak değerlendirirse (bunu sağlamadığınız için), bu alanı sadece jokerleyecektir ve diğerini arayacaktır. Her iki paramiti de belirtirseniz, her ikisi için de açık eşleşmeleri döndürür. – 10dot

+0

Teşekkürler. Ben has_scope gem ile gidiş sona erdi. Bunu anlamak için sıfırdan inşa etmek istedim, ama eninde sonunda yapmak istediğim şey için, sıfırdan inşa etmek biraz fazla karmaşık olabileceğini düşünüyorum. Yardım ettiğin için teşekkür ederim –