0

私はgrailsで作業しており、修正したい奇妙な動作に気づきましたが、何が欠けているのかわかりません。私は多くの建物を持つことができる場所を持っています。各建物には複数のスイートを含めることができます。さらに、テナントの場所を持つテナントがいます。テナントの場所は、テナントが場所を移動したかどうかを確認できるように、履歴レポートによく使用されます。クラスはこんな感じ

class Location {

    String name
    String shortName
    Country country
    LocationTypeEnum locationType = LocationTypeEnum.STUD // as default

    static hasMany = [building: Building]

    Date dateCreated
    Date lastUpdated

    static constraints = {
        name unique: true, maxSize: 30
        shortName unique: true, maxSize: 3
        country nullable: false
        locationType nullable: false
    }

    static mapping = {
        cache usage: 'nonstrict-read-write', include: 'non-lazy'
    }
}

class Building {
    String type
    String name
    Date dateCreated
    Date lastUpdated

    static belongsTo = [location: Location]
    static hasMany = [suites: Suite]

    static constraints = {
        name unique: true, maxSize: 25
        type inList: ["A", "B", "C"], nullable: true
    }

    String toString() {
        name
    }
}

class Suite {
    int suiteNumber
    Date dateCreated

    static belongsTo = [building: Building]

    static constraints = {

        pen(validator: { return it > 0 && (it.toString().length()) <= 3 })

    }

    String toString() {
        suite.toString()
    }
}

class Tenant {

    static hasMany = [tenantLocation: TenantLocation]

    ----
    Suite suite
    String comments
    Date dateCreated
    Date lastUpdated

    boolean active = true

    static constraints = {
        --------
        type
        nullable: false
        comments maxSize: 5000

    }

}

class TenantLocation {
    static belongsTo = [tenant: Tenant]
    Tenant tenant
    Suite suite
    Date dateCreated
}

したがって、テナントが作成されたときにテナントの場所が作成され、現在のテナント スイートが変更された場合にのみ新しい tenantLocation が作成されるという考え方です。

ただし、私が見ているのは、テナントの場所が保存されているだけでなく(これは私が望んでいることです)、スイートも更新されています(これは私が望んでいるものではありません)。

たとえば、建物 1 とスイート 1 ~ 20 と建物 2 とスイート 1 ~ 25 があります。建物 1 スイート 5 にテナントがあり、建物 2 スイート 23 に移動します。突然、建物 2 に 2 つのスイートがあります。スイート番号は 5 です。

テナントが変更しなければならないスイートのみが必要な場合に、スイートがある建物から別の建物に移動しないようにするにはどうすればよいですか?

更新を行っているコードはテナント コントローラーにあり、次のようになります。

def update() {
    def tenantInstance = Tenant.get(params.id)

    if (!tenantInstance) {
        flash.message = message(code: 'default.not.found.message', args: [
            message(code: 'tenant.label', default: 'Tenant'),
            params.id
        ])
        redirect action: "list"
        return
    }

    if (params.version) {
        def version = params.version.toLong()
        if (tenantInstance.version > version) {
            tenantInstance.errors.rejectValue("version", "default.optimistic.locking.failure",
                    [
                        message(code: 'tenantInstance.label', default: 'Tenant')] as Object[],
                    "Another user has updated this Tenant while you were editing")
            render view: "edit", model: [tenantInstance: tenantInstance, BuidingListInstance: Building.list()]
            return
        }
    }

    tenantInstance.properties = params

    if (!tenantInstance.save(flush: true)) {
        render view: "edit", model: [tenantInstance: tenantInstance, BuildingListInstance: Building.list()]
        return
    }


    def tenantLocation= TenantLocation.findAllByTenant(tenantInstance)
    def locationCheck = tenantLocation.last()



    //if tenant location is not null and the suite/building change create new Tenant Location entry
    if (tenantLocation!=null)
    {
        if(locationCheck.pen.id !=tenantInstance.suite.id)
        {

            def location = new TenantLocation(
                    tenant: tenantInstance,
                    suite: tenantInstance.suite,
                    dateCreated: new Date()
                    ).save(flush:true)
        }

    }



    flash.message = message(code: 'default.updated.message', args: [
        message(code: 'tenant.label', default: 'Tenant'),
        tenantInstance.id
    ])
    redirect action: "show", id: tenantInstance.id
}
4

0 に答える 0