2015-01-16 49 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