Grails проблема с уникальным / сохранить / обновить - PullRequest
0 голосов
/ 29 декабря 2010

У меня проблема с Граалем. У меня есть домен, который выглядит как:

class Book {

    static belongsTo = Author

    String toString() { title }

    Author bookAuthor
    String title
    String currentPage


    static constraints = {
        bookAuthor()
        title(unique:true)
        currentPage()

    }
}

Главное отметить, что у меня есть заголовок (уникальный: true) , чтобы избежать добавления одной и той же книги дважды. Однако это вызывает проблемы. В контроллере я создал:

def populate = {

    def bookInstance = new Book()

    def dir = 'C:/currentBooks.txt'
    def bookList

    bookList = readFile(dir)  //read file and push values into bookList

    int numOfBooks = bookList.size()

    numOfBooks.times {

        bookInstance.setBookAuthor(bookList.author[it])
        bookInstance.setTitle(bookList.title[it])
        bookInstance.setCurrentPage(bookList.title[it])
        bookInstance.save()
    }

}

Я звоню в populate, чтобы прочитать файл и заполнить базу данных новыми книгами. Проблема в том, что я хочу обновить его новыми значениями. Например, предположим, что книга уже существует в базе данных, но я прочитал дальше в книгу и хочу изменить currentPage , чтобы данные изменялись в файле и вызывалось заполнение, но не обновлялось страница, потому что заголовок уже существует.

Может кто-нибудь объяснить, как обновить результаты новыми значениями?

1 Ответ

3 голосов
/ 29 декабря 2010

Прежде всего, вам нужен ключ для вашего объекта домена Book.У вас есть название, помеченное как уникальное, что означает, что вы хотите использовать его для уникальной идентификации Книги.Я бы рекомендовал против этого (что происходит, когда две книги имеют одно и то же название?) И по умолчанию предоставляю id grails.Это означает, что вам придется хранить идентификатор в вашем currentBooks.txt в дополнение к другим полям.

После того, как вы получили идентификатор, вы можете попробовать загрузить существующую запись из базы данных.Если нет, создайте новый.Например:

def dir = 'C:/currentBooks.txt'
def bookList

bookList = readFile(dir)  //read file and push values into bookList

int numOfBooks = bookList.size()

numOfBooks.times {

    def bookInstance.get(bookList.id[it])
    if (!bookInstance) {
        bookInstance = new Book()
    }

    bookInstance.setBookAuthor(bookList.author[it])
    bookInstance.setTitle(bookList.title[it])
    bookInstance.setCurrentPage(bookList.title[it])
    bookInstance.save()
}

В качестве альтернативы вы можете использовать заголовок в качестве идентификатора.Это плохая идея, как указано выше, но она избавляет от необходимости отслеживать отдельный идентификатор и изменять формат currentBooks.txt.Если книга определена, как показано ниже, вы можете позвонить Book.get(bookList.title[it]):

class Book {

    static belongsTo = Author

    String toString() { title }

    Author bookAuthor
    String title
    String currentPage

    static constraints = {
        bookAuthor()
        title(unique:true)
        currentPage()
    }

    static mapping = {
        id name: 'title', generator: 'assigned'
    }
}
...