2015-01-16 86 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工作innested查詢,我的實際錯誤是undefined local variable or method 'is_private'(顯然)。

有沒有辦法使用Squeel(或其他ActiveRecord查詢生成器)來構建類似這樣的東西?

謝謝大家!

+0

滑稽找到'showable'但不是'is_private' – apneadiving

+0

@apneadiving'showable'是子類(叫我的'send'方法)的功能,而'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:錯誤:列collections.my不存在'。 – Rowandish

+0

:)以前從未使用squeel,我的區塊真的有必要嗎?你可以嘗試沒有它? – apneadiving

+0

'my'用於調用'where'塊內的實例方法。我嘗試了這種方式,現在一切正常:'head.where {| q |發送(method_name,q)}'。你可以編輯你的答案,我會接受它:) – Rowandish