2017-07-26 43 views
0

我在我的PostgresDB中准备了一个名为user_details的视图。我创建了UserDetail实体和UserDetailRepository。在这里你缩短了我的视图版本,以可视化我的问题:使用参数化视图与Hanami存储库

CREATE VIEW user_details AS 
SELECT id, user_name FROM users WHERE user_name like '$1#%' 

我的问题是如何使用Hanami存储库注入参数?

我可以在我的仓库中使用原始数据库,这里描述的是http://hanamirb.org/guides/models/repositories/,但我更喜欢使用迁移在postgres中创建视图。我不想改进查询,但要知道是否可以使用Hanami进行用户参数化查询。感谢所有答案

回答

1

PostgreSQL不支持您描述的参数化视图。它可以具有调用函数的视图,以便访问当前会话状态,并且您可以在之前从该视图中选择数据,然后设置该状态。不过,我建议你用一个参数来定义一个方法

class UserRepo 
    def user_details(prefix) 
    root.project { [id, user_name] }.where { user_name.ilike("#{ prefix }%") }.to_a 
    end 
end 

你得到的结果基本上是一样的。如果您想使用user_details作为基础关系,则可以在回购中定义私有方法并从其他公共方法中调用该方法

class UserRepo 
    def user_details_filtered(user_name, min_user_id = 0) 
    user_details(prefix).where { id > min_user_id }.to_a 
    end 

    def user_details_created_after(user_name, after) 
    user_details(prefix).where { created_at > after }.to_a 
    end 

    private 

    # Don't call this method from the app code, this way 
    # you don't leak SQL-specific code into your domain 
    def user_details(prefix) 
    root.project { [id, user_name] }.where { user_name.ilike("#{ prefix }%") } 
    end 
end