Nano Hash - криптовалюты, майнинг, программирование

Grails подсчитывает дочерние элементы от одного ко многим в пределах доменного класса.

У меня есть отношение один ко многим:

class Author {
    String name
    static hasMany = [books:Book]
    static constraints = {
    }
}

class Book {
    String name
    static belongsTo = [author:Author]
    static constraints = {
    }
}

Я хочу иметь возможность подсчитывать количество книг, принадлежащих автору в классе авторов, чтобы результирующая сгенерированная таблица MySQL выглядела так:

id | version | name | bookcount
-- | ------- | ---- | ---------
 1 |       0 | foo  |        15
 2 |       0 | bar  |         3
 3 |       0 | baz  |         7

... где bookcount - это определенное поле в классе автора:

class Author {
    String name
    int bookcount = ??
    static constraints = {
    }
}

РЕДАКТИРОВАТЬ 1: количество книг должно быть сохранено в базе данных.

07.07.2014

  • Вам нужно сохранить это значение в базе данных? или вам просто нужен другой способ вычислить это значение? 07.07.2014
  • да. Для меня важно, что bookcount является свойством Author, так что к нему можно получить доступ с помощью чего-то вроде authorInstance.bookcount 07.07.2014
  • Вы также можете получить bookCount с помощью метода с именем getBookCount в классе Author с тем, что вы думаете делать в контроллере. Например, Integer getBookCount() { Book.countByAuthor( this ) }. 07.07.2014
  • У вас есть много возможностей: временные свойства (не сохраняются в БД) или что-то вроде bookcount = author.book ? author.book.size() : 0 или использование перехватчика для увеличения значения в реальном поле (это будет реальное поле в вашей базе данных) 07.07.2014
  • Эта ссылка поможет вам, если вам не нужно сохранять значение в БД: grails.org/doc/2.4.x/ref/Domain%20Classes/transients.html (реализация будет такой же, как в комментарии dmahapatro) 07.07.2014
  • Как уже отмечалось, вы можете реализовать это несколькими способами. Однако есть варианты использования для сохранения этой информации в базе данных. Чтобы сохранить эту информацию, вам нужно будет использовать прослушиватели пользовательских событий для сохранения. В справочной документации объясняется, как их создавать и регистрировать. grails.org/doc/latest/guide/GORM.html#eventsAutoTimestamping 07.07.2014

Ответы:


1

Вы можете сделать следующее, используя события gorm:

class Author {
    String name

    Integer bookCount = 0
    static hasMany = [books:Book]

    Integer getBookCount () {
        books?.size () ?: 0
    }

    void beforeUpdate () {
        bookCount = getBookCount ()
    }

    static constraints = {
    }
}

Метод beforeUpdate будет вызываться перед обновлением объекта в базе данных.

Получатель свойства getBookCount() гарантирует, что мы всегда получим правильное значение. Если автор еще не сохранен после добавления дополнительных Books, bookCount не будет обновлен до тех пор, пока автору не исполнится save()d.

Если бы мы не использовали bookCount из кода, мы могли бы его встроить.

def "explicitly persist book count" () {
    given:
    Author author = new Author(name:'author')
    author.save (failOnError: true)

    when:
    author.addToBooks (new Book(name:'book'))
    author.save (failOnError: true, flush: true)

    then:
    author.bookCount == 1
    author.@bookCount == 1
}
10.07.2014

2

Альтернативный способ, если вы не хотите извлекать все дочерние элементы из базы данных и подсчитывать их, что может быть плохо для очень больших наборов данных, — это метод, подобный этому, в родительском классе.

    def numberOfChildren()
{
    def result = Child.executeQuery("select count(*) from Child where parent = :parent", ["parent":this])
    def resultCount = result[0]
    return resultCount
}
06.08.2016
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..