1

ransack을 사용하여 나이별로 결과를 필터링하려고하지만 ransack이 정의되지 않은 메소드 오류를 발생시킵니다. 내 데이터베이스에 사용자 DOB가 있고 사용자 모델에 사용자 나이를 계산하는 연령 방법이 있습니다. 그것은 완벽하게 정상적으로 작동하고이 같은 사용자의 연령 호출 할 수 있어요 :Ransack gem을 사용하여 나이별로 필터링 할 때 정의되지 않은 메소드 오류

내가 내 컨트롤러에 다음과 같은 한 더듬다 지금
@user = User.find(1) 
@user.age 

: 내보기에서

def index 
    @search = User.search(params[:q]) 
    @users = @search.result 
    end 

, 내가 가진 :

undefined method `age_gteq' for Ransack::Search<class: User, base: Grouping <combinator: and>>:Ransack::Search 
:
<%= search_form_for @search do |f| %> 
    <%= f.label :age_gteq, "Ages:" %> <%= f.text_field :age_gteq %> 
    <%= f.label :age_lteq, "to" %> <%= f.text_field :age_lteq %> 
    <%=f.submit "Filter", class: "button" %> 
<% end %> 

이 내가 점점 오전 오류입니다

나는 동일한 오류가 발생할 것이라고 확신합니다. age_lteq

+0

당신은'attr_accessible'에'age'를 추가 했습니까? – Zippie

+0

아니, 나는하지 않았다. 나는 그것이 데이터베이스에 저장된 사용자의 속성이 아니라 메소드이기 때문에해야만했는지 확신 할 수 없었습니다. – pratski

+0

죄송합니다. 나이는 아니지만'age_gteq'와'are_lteq'입니다. 나는 렁을 사용하는 방법을 모르지만 힌트 여야한다. – Zippie

답변

3

현재 Ransack은 데이터베이스 열에서만 작동하기 때문에 나는 작동하지 않습니다. 결국 Ransack은 정교한 SQL 쿼리 생성기입니다.

이 예제에 대해 생각 :

User.where('age >= ?', 30) 

어떤 SQL 쿼리의 모습?

SELECT * FROM user WHERE age >= 30 

Ransack이 일반적인 비 데이터베이스 속성에서 이러한 조건을 파이프해도 SQL은 여전히 ​​잘못된 것입니다. (age 열이 없으므로)

한 가지 해결책은 양식에 원래 생년월일 열을 사용하고 일부 자바 스크립트를 사용하여 사용자가 날짜 대신 나이 번호를 입력 할 수있게하는 것입니다. 예를 들어 onsubmit 이벤트를 청취하고 input의 콘텐츠를 수정합니다.

업데이트 2014년 1월 8일는 :

이 일을하는 또 다른 가능성이있다. 당신의 User 모델이 추가

ransacker :age do 
    Arel::Nodes::SqlLiteral.new(
    'DATE_PART('year', AGE(NOW(), date_of_birth_column))') 
    # Beware: PostgreSQL specific SQL! 
end 

A "ransacker를"나중에 더듬다에 의해 생성 된 Arel 노드에 부착 할 것 Arel 노드를 반환해야합니다.

이렇게하면 일반 데이터베이스 열과 마찬가지로 age_eq 및 다른 모든 Ransack 조건자를 사용할 수 있습니다.