을 명명 된 범위를 선택할 수 있도록, 내가 명명 된 범위가 params[:scope] = 'random'
과 함께 GET 요청사용자가 GET의 PARAMS를 통해 내 게시물 모델에서
eval("Post.#{params[:scope]}")
의 줄임말, 어떻게해야합니까?
을 명명 된 범위를 선택할 수 있도록, 내가 명명 된 범위가 params[:scope] = 'random'
과 함께 GET 요청사용자가 GET의 PARAMS를 통해 내 게시물 모델에서
eval("Post.#{params[:scope]}")
의 줄임말, 어떻게해야합니까?
. searchlogic이 적합합니다.
나는 사용자가 제공 한 데이터를 다루고 있기 때문에 eval에서 멀어 질 것이다. 단순한 case 문을 사용하는 것일까 요? 이렇게하면 자신이 제공하는 데이터의 유효성을 확인할 수 있습니다.
나는 named_scopes를 통해 결과를 사용자 중심 필터링하도록 설계된 매우 훌륭한 acts_as_filter 플러그인을 제안합니다.
http://github.com/tobyhede/acts_as_filter/tree/master
평가가 사용하는 괜찮 - (? 나는 종종 단지 배열 및 테스트 accepted_values.include으로 일부 값을 연결 (매개 변수))하지만, 허용/예상 값에 대해 유효성 확인
평가 꽤 나쁜 생각입니다. 그러나 #send는 완벽합니다. 본질적으로 더 안전하며 eval보다 빠릅니다 (이해함).
Product.send(params[:scope])
는, 내가 명시 것, 체인 범위가 함께 원하는 쿼리를 구축하는 당신이주는 예를 들어
을 :)해야한다 : 만약
scope = Post
scope = scope.random if params[:scope] == 'random'
@posts = scope.find(:all, ...) # or paginate or whatever you need to do
을 PARAMS [ : scope]는 'random'이 아니며, Post.find()를 호출하는 것과 같습니다. 그렇지 않으면 Post.random.find()를 수행하고 있습니다.
find_by_filter가 꽤 도움이되는 것처럼 보입니다. 훨씬 얇은 g.
이 패턴을 사용하면 상호 배타적 인 것이 아닌 을 지원해야하는 경우 여러 스코프를 검색어에 결합 할 수 있습니다. ?
scope = scope.only_monsters if params[:just_monsters] == 1
scope = scope.limit(params[:limit].to_i) unless params[:limit].to_i.zero?
그래서하기/게시물 범위 = 임의 & just_monsters = 1 개 & 제한 = 5 당신을 줄 것이다 : 나는 검색에서 건너 온
Post.random.just_monsters.limit(5).find(:all, ...)