Связь с Grails m:n:n

Мы работаем с существующей базой данных mysql под grails, которая содержит отношение m:n. Здесь нет проблем. Но теперь мы находимся в ситуации, когда мне нужно добавить вторую запись отношения n, которая ссылается на ту же таблицу и должна быть связана с первой записью n.

Если бы это было для базы данных, я бы просто создал таблицу, которая выглядит так:

field m_id -> links to m table
field n_id1 -> links to n table
field n_id2 -> links to n table

Но как это можно представить в классе предметной области Grails?

Возможно, ответ уже где-то можно найти, но мои поиски не увенчались успехом, возможно, из-за отсутствия креативности в поиске.

РЕДАКТИРОВАТЬ:

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

Хм... подумайте о гонщиках, номинирующихся на серию гонок, и в каждой номинации должен быть гонщик и его заместитель. Гонки будут m (левая рука), водитель будет n1, а запасной будет n2. (Это была действительно тяжелая работа, чтобы найти пример...)

РЕДАКТИРОВАТЬ:

По стечению обстоятельств я нашел этот вопрос, который касается того же проблема, но также осталась довольно нерешенной.


person syck    schedule 25.06.2015    source источник
comment
Интересно, что человек получает отрицательный голос за вопрос, который был задан более четырех месяцев назад.   -  person syck    schedule 06.10.2015


Ответы (2)


Взгляните на документацию, она довольно ясна: http://grails.github.io/grails-doc/2.5.0/guide/GORM.html#gormAssociation

В любом случае, я не уверен, что понимаю, что вы пытаетесь сделать, но давайте попробуем.

Если это отношение один к одному, вы можете просто сделать что-то вроде этого:

class DomainA {

    DomainB domainB
    DomainC firstDomainC
    DomainC secondDomainC
}

class DomainB {
}

class DomainC {
}

Это создаст следующие поля в таблице «domain_a»:

  • "domain_b_id"
  • "first_domain_c_id"
  • "второй_домен_c_id"

Если это отношение «один ко многим» между доменом A и доменом B, и доменом C с двумя дифференцированными коллекциями домена C в домене A, у вас должны быть два разных свойства домена A в домене C, чтобы иметь возможность сопоставить его.

Пример с Airport и Flight в документации:

class Airport {
    static hasMany = [outboundFlights: Flight, inboundFlights: Flight]
    static mappedBy = [outboundFlights: "departureAirport",
                   inboundFlights: "destinationAirport"]
}
class Flight {
   Airport departureAirport
   Airport destinationAirport
}

Полет должен иметь свойства аэропорта, чтобы иметь возможность различать, какой из них отображает правильную коллекцию hasMany в аэропорту.

РЕДАКТИРОВАТЬ: для примера гонщика

Grails поддерживает отношения многие-ко-многим, но один из концов должен быть главным, а другой должен иметь к нему дополнительное отношение. Хотя это не так, поскольку ни гонка не принадлежит гонщику, ни гонщик не принадлежит гонке. Я бы использовал отношение со свойством: «диски» со свойством «mainDriver». Это не может быть сопоставлено напрямую, вам нужно использовать домен для отношения:

class Race {
    static hasMany = [ participants: DriverRace ]

    def mainDrivers() {
        getDrivers( false )
    }

    def substitutes() {
        getDrivers( false )
    }

    private getDrivers( mainDriver ) {
        DriverRace.withCriteria {
            eq( "race", this )
            eq( "mainDriver", mainDriver )
        }.collect { it.driver }
    }
}

class Driver {
    static hasMany = [ races: DriverRace ]
}

class DriverRace {
    static belongsTo = [ race: Race, driver: Driver ]

    boolean mainDriver

}
person ncerezo    schedule 25.06.2015

Мы думали, что сможем решить проблему, вставив вторую ссылку на домен/таблицу n в свойство сопоставления (слева) домена m. Затем Grails помещает вторую ссылку на n в правую часть отношения. Но это оказалось многообещающей мечтой выходного дня.

person syck    schedule 26.06.2015
comment
Проверьте мой обновленный ответ. Кстати, я думаю, вы должны были отредактировать свой вопрос вместо ответа :) - person ncerezo; 28.06.2015