2017-07-26 3 views
0

J'ai préparé une vue dans mon PostgresDB appelée user_details. J'ai créé UserDetail entité et UserDetailRepository. Ici vous avez la version abrégée de mon point de vue de visualiser mon problème:Utilisation de vues paramétrées avec des référentiels Hanami

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

Ma question est de savoir comment le paramètre injectent à l'aide du référentiel Hanami?

Je peux utiliser raw sql dans mes repos qui est décrit ici http://hanamirb.org/guides/models/repositories/ mais je préfère créer une vue dans postgres en utilisant les migrations. Je ne veux pas améliorer la requête mais savoir si je peux utiliser les requêtes paramétrées par l'utilisateur avec Hanami. Merci pour toutes les réponses

Répondre

1

PostgreSQL ne prend pas en charge les vues paramétrées de la manière que vous avez décrite. Il peut avoir des vues qui appellent une fonction qui, dans l'ordre, peut accéder à l'état de session en cours et vous pouvez définir cet état juste avant en sélectionnant des données dans la vue. Cependant, je vous recommande de définir une méthode avec un argument à la place

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

Ce que vous obtenez avec ceci est fondamentalement le même. Si vous souhaitez utiliser user_details comme relation de base, vous pouvez définir une méthode privée sur le référentiel et l'appeler à partir d'autres méthodes publiques

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