2015-01-16 2 views
1

여기, squeel을 사용하여 쿼리 빌더를 구축하고 싶습니다 내가했던 방법입니다Squeel을 사용하여 innested 쿼리를 만드는 방법은 무엇입니까?

부모 클래스 :

module ModelFilters 
    class Base 
    def initialize(user) 
     @user = user 
    end 

    def build(method_name) 
     head.where { my { send(method_name) } } 
    end 

    protected 

    def head 
    end 
    end 
end 

아이 클래스 :

module ModelFilters 
    class Collection < Base 
    def __showable__ 
     not_private | author 
    end 

    protected 

    def head 
     ::Collection.joins(:collaborators) 
    end 

    private 

    def not_private 
     is_private == false 
    end 

    def author 
     user_id == @user.id 
    end 
    end 
end 

그리고 마지막으로 내 전화 :

a = ModelFilters::Collection.new(user) 
a.build(:__showable__) 

사실 내 문제는 내가하는 것입니다. 내 질문에 대한 Squeel 작동 방식을 모르지만 실제 오류는 undefined local variable or method 'is_private' (분명히)입니다.

Squeel (또는 다른 ActiveRecord 쿼리 작성기)을 사용하여 이와 같은 방법으로 빌드 할 수 있습니까?

감사합니다.

+0

재미는'showable'을 발견하지만'동안, showable'이 (내은'send' 방법이라고 함) 자식 클래스의 함수'@apneadiving – apneadiving

+0

을 is_private' 'is_private'는 내 모델 속성입니다 – Rowandish

답변

2

당신이 할 경우에는 어떻게 :

module ModelFilters 
    class Base 
    def initialize(user) 
     @user = user 
    end 

    def build(method_name) 
     head.where { |q| send(method_name, q) } 
    end 

    protected 

    def head 
    end 
    end 
end 

module ModelFilters 
    class Collection < Base 
    def __showable__(q) 
     not_private(q) | author(q) 
    end 

    protected 

    def head 
     ::Collection.joins(:collaborators) 
    end 

    private 

    def not_private(q) 
     q.is_private == false 
    end 

    def author(q) 
     q.user_id == @user.id 
    end 
    end 
end 
+0

답을 보내 주셔서 감사합니다. 올바른 해결책에 매우 가깝지만 실제로는 다음과 같은 오류가 발생합니다 : PG :: UndefinedColumn : ERROR : column collections.my does not exist'. – Rowandish

+0

:) 전에는 절대로 사용하지 마시고, 제 블록은 정말로 필요한가요? 그것없이 시도해도 될까요? – apneadiving

+0

'my'는'where' 블록 내부에서 인스턴스 메소드를 호출하는 데 사용됩니다. 나는이 방법으로 시험해 보았습니다. 이제 모든 것이 작동합니다 :'head.where {| q | send (method_name, q)}'를 호출하십시오. 당신은 당신의 대답을 편집 할 수 있습니다. 나는 그것을 받아 들일 것입니다. – Rowandish

관련 문제