2016-10-20 1 views
0

Ich bin neu in Rails, und ich versuche, die Tiere, die ich auf meiner DB, durch eine ihrer Eigenschaften zu filtern. Ich habe gelesen, dass ich es durch einen Bereich im Controller machen kann, und durch einen Parameter auf die URL zugreifen kann, aber ich denke, dass das nicht funktioniert, weil ich eine Schleife verwende, um mein HTML zu erstellen.So filtern Sie Sammlungen in Schienen

Gibt es eine Möglichkeit, der Sammlung, die ich verwende (@animals), einen Filter hinzuzufügen?

<% @animals.each do |animal| %> 
    <li> 
    <a href="#"> 
     <%=link_to animal.ncommon, animal %> 
    </a> 
    </li> 
<% end %> 

Ich hoffe, ich war klar mit meiner Frage. Danke für Ihre Hilfe!

+0

Können Sie klarstellen, was Sie mit "Ich kann es durch einen Bereich in der Steuerung machen ..." ...? – jacefarm

+0

der Umfang, auf den ich mich bezog, ist, was sameera207 unten kommentierte. Er korrigiert mich nur, dass der Bereich im Modell sein muss, nicht in der Steuerung. –

Antwort

0

Die beste Vorgehensweise ist also, die scope zu den Modellen zu verschieben, nicht in der Steuerung. Hier ist und Beispiel. (Bitte beachten Sie, dass sich dies je nach Dateistruktur und Namen ändern kann).

Hier werde ich Tiere nach Typ filtern. Sagen wir 1 und 2.

#model app/models/animal.rb 
class Animal < ActiveRecord::Base 
    scope :by_type, -> (ty) { where(type: ty) } 
end 

#controller app/controllers/animals_controller.rb 

class AnimalsController < ApplicationController 
    ... other code 

    def index 
    # calls the by_type method/scope in the Animal model 
    # filter the records and assignes them to @animals varaible 
    @animals = Animal.by_type(params[:type]) 
    end 

    ... other code 
end 

dann können Sie Ihre Schleife in der Ansicht verwenden. Wenn Sie filtern möchten, rufen Sie den Index Aktion mit einem Parameter

Z. B http://localhost:3000/animals?type=1

Also die Idee ist, nicht innerhalb der Schleife zu filtern, aber die gefilterten Ergebnisse der @animals Variable zu erhalten.

+0

Vielen Dank! das wird mir bei einer anderen ähnlichen aufgabe helfen, die ich zu tun habe, aber ich habe gerade eine andere lösung gefunden, die ich in der schleife verwenden kann, die ich gerade sprach. Ich werde es in einem anderen Kommentar veröffentlichen. Vielen Dank für Ihre Antwort! –

0

Ich habe gerade eine Lösung gefunden, die ich in der Schleife verwenden kann. I geändert:

<% @animals.each do |animal| %> 

zu:

<% @animals.where("promo > ?", 0).each do |animal| %> 

Hier bin ich alle Tiere erhalten, die eine Promo größer als Null ist.
Danke!

+0

hey @chavez, während Ihre Lösung gut funktioniert, beachten Sie bitte, dass ActiveRecord-Abfragen in der Ansicht als Code-Geruch zu betrachten. :) – sameera207