2010-09-30 4 views
0

Comme je suis un peu nouveau à Grails, je me demande comment je peux parcourir les données actuelles que j'ai enregistrées dans la base de données pour vérifier si les informations existent déjà. Par exemple, disons que j'ai une classe de domaine pour Livres et que je crée une action qui ajoute automatiquement plus de livres mais je veux vérifier si le livre.title existe déjà, donc je ne l'ajoute pas à nouveau.Grails itérant à travers les tables de base de données

Note Side Je suis juste en utilisant la base de données par défaut (tout ce qui est utilisé lorsque le projet est réglé sur le mode de production)


Modifier

Je posterai mes domaines donc c'est un peu plus facile à comprendre. Au lieu de book.title, je l'ai changé à l'endroit où le livre appartient à l'auteur. Donc je veux seulement que l'auteur soit ajouté une fois mais capable d'ajouter beaucoup de livres pour cela. Le problème se produit dans une action que j'ai créée dans le contrôleur.

Auteur Domaine:

class Author { 

    static hasMany = [books:Book] 

    String authorName 
    String notes 
    String age 

    String toString() { authorName } 


    static constraints = { 
     authorName() 
     notes(maxSize:500) 
     age() 
    } 
} 

Livre Domaine:

class Book { 

    static belongsTo = Author 

    String toString() { bookNumber } 

    Author bookAuthor 
    String title 
    String numberOfPages 


    static constraints = { 
     bookAuthor() 
     title() 
     numberOfPages() 
    } 
} 

Controller Book (c'est là que je vais avoir des problèmes):

class BookController { 

    static allowedMethods = [save: "POST", update: "POST", delete: "POST"] 

    //took out index, create, list, etc. to focus on the once that I'm concerned about 


    //this action will simple read a text file and add books and authors 
    def gather = { 

     def parseData = new parseClient()  //parses text file line by line and puts it into a list 
     def dataHolder = parseData.information //dataHolder will hold data from text file 

     int linesOfData = dataHolder.size()  //get size to iterate and add authors & books 

     linesOfData.times { 
      def _author = dataHolder.author[it] //get author - Author 
      def _age = dataHolder.age[it]  //get age - Author 

      def _title = dataHolder.title[it] //get title - Book 
      def _pages = dataHolder.pages[it] //get pages - Book 

      def authorInstance     //create new Author to add 
      authorInstance = new Author()  //for some reason I have to create and save AuthorName (can't have other fields) before I can add my Book correctly 
      authorInstance.setAuthorName(_author) 
      authorInstance.save() 

      def bookInstance 
      bookInstance = new Book()   //create a new Book to add 
      bookInstance.setBookAuthor(authorInstance) 
      bookInstance.setTitle(_title) 
      bookInstance.setNumberOfPages(_pages) 
      bookInstance.save()     //has to have access to the authorInstance to add correctly which is why i was wondering how to access the database to grab it if it existed 

      authorInstance.setAge(_age)  //add whatever data is left for Author 
      authorInstance.save()    //save again because cant save it with this information before I add authorInstance to the Book 
     } 

    } 

} 

Texte Contenu du fichier:

//You'll notice that author _Scott Davis_ is in here twice. 
//I don't want to add two instances of Scott Davis but need to access it to add the book 
//the unique constraint makes the value come up as not null but can't be added 

Scott Davis : Groovy Recipes 
Bashar Abdul Jawad : Groovy and Grails Recipes 
Fergal Dearle : Groovy for Domain-Specific Languages 
Scott Davis : GIS for Web Developers: Adding 'Where' to Your Web Applications 

Je suis à la recherche essentiellement un moyen d'ajouter cette information et n'ont pas trouvé un moyen qui semble fonctionner sans se heurter à des problèmes aléatoires.

Hope this efface ma question un peu, comme la question initiale était un peu large

Répondre

3

Dans ce cas, vous pouvez mettre une contrainte unique sur le titre et Grails le fera pour vous.

Vous pouvez itérer à travers les données, mais vous ne voulez probablement pas charger la base de données si vous pouvez l'éviter. Ainsi, vous pouvez écrire une requête personnalisée pour sélectionner le nombre de livres pour le titre, par exemple.

Edit: pour vos mises à jour

  1. Vous n'avez pas besoin d'utiliser setters dans votre contrôleur. Grails ajoute des setters/getters pour vous dynamiquement à l'exécution. Si vous voulez mettre de la logique dans vos setters, alors vous pouvez définir les vôtres et les utiliser dans ce cas

  2. Avez-vous regardé la documentation de Grails? http://grails.org/doc/latest/

vous avez un bloc de contraintes statiques, mais vous n'avez pas défini la façon dont vous voulez que chaque propriété à contraindre.pour le titre unique, il serait

title(unique:true) 

si vous souhaitez obtenir une liste des noms d'auteur, vous pouvez faire

List names = Author.executeQuery('select authorName from Author') 
+0

Merci pour les hvgotcodes d'aide, la contrainte unique fonctionnerait, mais je compris que J'ai des problèmes en ajoutant. Je vais éditer mon post original sous peu avec le problème mis à jour. – StartingGroovy

+0

Juste pensé que je voudrais vous faire savoir que j'ai mis à jour le post principal avec la question plus spécifique. – StartingGroovy

+0

1. Peut-être que je comprends mal votre numéro 1, mais cela fonctionne très bien lors de l'ouverture du site Web et la création de l'auteur ou du livre manuellement. Les setters que j'ai sont pour quand je lis un fichier et que je veux pousser les informations du fichier directement sans avoir à les taper. J'ai dû diviser authorInstance en deux parce que bookInstance ne créera pas s'il y a d'autres parties de info dedans. – StartingGroovy

Questions connexes