2016-10-20 2 views
0

저는 레일스에서 ​​새로운데, DB에있는 동물을 그 속성 중 하나를 필터링하려고합니다. 컨트롤러의 범위로 만들 수 있고 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 

그런 다음보기에서 루프를 사용할 수 있습니다. 필터링 할 때, 당신은 그래서 아이디어는 루프 내에서 필터링 할 수 있지만, @animals 변수에 필터링 된 결과를 얻을 아닌 매개 변수

예컨대 http://localhost:3000/animals?type=1

와 인덱스 조치를 호출합니다.

+0

감사합니다. 이것은 내가해야만하는 또 다른 비슷한 일을하는데 도움이 될 것이지만, 나는 내가 말하는 루프에서 사용할 수있는 또 다른 해결책을 발견했다. 나는 다른 코멘트에 그것을 게시 할 것이다. 답장을 보내 주셔서 감사합니다. –

0

방금 ​​루프에서 사용할 수있는 솔루션을 찾았습니다. 나는 변경 :

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

에 : 여기

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

미안이 0보다 큰 프로모션이 모든 동물을 받고.
감사합니다.

+0

안녕하세요 @ chavez, 귀하의 솔루션이 잘 작동하는 동안보기에서 ActiveRecord 쿼리가 코드 냄새라고 생각하십시오. :) – sameera207

관련 문제