2

Je crée une application nécessitant l'approbation de l'administrateur lorsque les articles sont créés et mis à jour. J'ai utilisé la trace de papier pour accomplir ceci, en stockant chaque mise à jour aux articles.Rails & Papertrail - Inclure la version précédente dans la requête

Lorsqu'un article est mis à jour, le champ "published" est défini sur false. Puisque je veux afficher la version approuvée/publiée la plus récente de l'article, j'ai besoin d'une sorte de portée qui vérifie si la version actuelle de l'article est approuvée, et si ce n'est pas le cas, elle recherche dans les versions précédentes jusqu'à ce qu'elle trouve un approuvé/publié.

def self.published(query={}) 
    where(query).map do |article| 
    article.published? ? article : article.last_published_version 
    end.compact! || [] 
end 

def published?() 
    published 
end 

def last_published_version() 
    return self if published? 
    published_versions = versions.select{ |version| version.reify.try(:published?) } 
    published_versions.present? ? published_versions.last.reify : nil 
end 

Maintenant, depuis que je me sers map ici, ma requête est retourne un tableau au lieu d'une relation ActiveRecord. Je voudrais enchaîner des requêtes supplémentaires sur les articles publiés, donc c'est un problème.

Par exemple, je voudrais faire: Article.published.where(...).order_by(...), etc

Toutes les idées sur l'accomplissement de cette?

Répondre

1

Je suggère de faire une association directe et joins les 2 ensemble de sorte que vous pouvez ajouter des termes de recherche contre la table de versionnage. J'utiliserais également une classe de version personnalisée (pas que vous ne puissiez pas le faire avec la table de version par défaut) et définirais les méta-données auxquelles vous auriez régulièrement accès (ou dont vous auriez besoin pour la recherche), car la version est sérialisée meta option. Serait probablement plus rapide et la recherche/l'accès aux données serait plus pratique de cette façon.

+0

Merci, votre contribution a été très utile. Je suis venu avec des requêtes qui me permettent d'obtenir toutes les lignes pertinentes à partir des tables (si elle est définie à publié dans la table des articles, je prends cette ligne, sinon je prends la ligne de la table des versions). Cependant, ce que je finis avec est une combinaison de lignes utilisables, et les lignes qui ont des données sérialisées. L'ajout de métadonnées résoudrait le problème, mais j'ai besoin fondamentalement de tous les champs, et je ne pense pas que ce soit une bonne idée de recréer toutes ces colonnes dans la table des versions. Des pensées? – RyanB

+0

Pouvez-vous expliquer "lignes utilisables" et "lignes qui ont des données sérialisées", quelle est la différence? – nowk

+0

Je pense qu'il veut dire qu'il obtient un mélange d'articles et de versions où les articles sont "utilisables" (objets réguliers), mais les versions contiennent des données sérialisées. Idéalement, vous retrouverez toujours le même type d'objets. - @RyanB Je me rends compte que cette question a 3 ans, mais je suis confronté au même problème et j'aimerais entendre ce que vous avez fini par faire. – Marc

Questions connexes