2016-10-20 3 views
0

Я новичок в Rails, и я пытаюсь отфильтровать животных, которые у меня есть на моей БД, одним из их свойств. Я прочитал, что могу сделать это с помощью области в контроллере и иметь доступ к ней по параметру в URL-адресе, но я думаю, что это не работает для меня, потому что я использую цикл для создания своего HTML-кода.Как фильтровать коллекции в рельсах

Есть ли способ добавить фильтр в коллекцию, которую я использую (@animals)?

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

Надеюсь, у меня был ясный вопрос. Спасибо за помощь!

+0

Можете ли вы пояснить, что вы подразумеваете под «Я могу сделать это с помощью области в контроллере ...» ...? – jacefarm

+0

Объем, на который я имел в виду, это то, что sameera207 прокомментировал ниже. Он просто исправит меня, что область должна быть в модели, а не в контроллере. –

ответ

0

Так что лучше всего переместить scope на модели, а не в контроллер. Вот и пример. (обратите внимание, что это может измениться в зависимости от вашей файловой структуры и имен).

здесь я собираюсь фильтровать животных по типу. Допустим, тип 1 и тип 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 

, то вы можете использовать свою петлю на виду. Если вы хотите, чтобы отфильтровать, вы вызываете действие индекса с параметром

http://localhost:3000/animals?type=1 например

Так что идея состоит в том, чтобы не фильтровать внутри цикла, но, чтобы получить отфильтрованные результаты переменной @animals.

+0

Спасибо! это поможет мне в другой аналогичной задаче, которую я должен сделать, но я нашел другое решение, которое я могу использовать в цикле, который я говорил. я опубликую его в другом комментарии. Большое спасибо за ваш ответ! –

0

Я только что нашел решение, которое я могу использовать в цикле. я изменил:

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

к:

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

Здесь i'm получение всех животных, которые имеют промо больше нуля.
Спасибо!

+0

эй @chavez, в то время как ваше решение прекрасно работает, обратите внимание, что наличие запросов ActiveRecord в представлении рассматривается как запах кода. :) – sameera207

Смежные вопросы