【问题标题】:Grails view and filter events by user IdGrails 按用户 ID 查看和过滤事件
【发布时间】:2014-05-20 15:30:28
【问题描述】:

我有一个域类:

类事件{ static belongsTo = [赞助商,旧]

String evento
Date data = new Date()
String local
Sponsor sponsor
Old old

static constraints = {
    data(blank: false)
    local(blank: false)
    evento(blank: false)
}

}

我自动生成视图和控制器(生成视图),现在当我登录时,在我的视图个性化中我有所有事件...如何按用户 ID(登录)过滤结果?

我的页面是:

...
<div id="list-events" class="content scaffold-list" role="main">
        <h1>Agenda</h1>
        <br>
        <table>
        <thead>
                <tr>

                    <g:sortableColumn property="data" controller ="events" title="${message(code: 'events.data.label', default: 'Evento') } " />

                    <g:sortableColumn property="local" controller ="events" title="${message(code: 'events.local.label', default: 'Local')}" />

                    <g:sortableColumn property="evento" controller ="events" title="${message(code: 'events.evento.label', default: 'Data')}" />

                </tr>
            </thead>
            <tbody>
            <g:each in="${eventsInstanceList}" status="i" var="eventsInstance">
                <tr class="${(i % 2) == 0 ? 'even' : 'odd'}">

                    <td><g:link action="show" id="${eventsInstance.id}">${fieldValue(bean: eventsInstance, field: "evento")}</g:link></td>

                    <td>${fieldValue(bean: eventsInstance, field: "local")}</td>

                    <td>${fieldValue(bean: eventsInstance, field: "data")}</td>

                </tr>
            </g:each>
            </tbody>
        </table>
        <div class="pagination">
            <g:paginate total="${eventsInstanceCount ?: 0}" />
        </div>
    </div>
</div>...

并在_form中:

<div class="fieldcontain ${hasErrors(bean: eventsInstance.old, field: 'data', 'error')} required">
<label for="data">
    <g:message code="events.data.label" default="Data" />
    <span class="required-indicator">*</span>
</label>
<g:datePicker name="data" precision="day"  value="${eventsInstance?.data}"  />

* * * *

还有我的控制器:

class EventsController {

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

def index(Integer max) {
    params.max = Math.min(max ?: 10, 100)
    respond Events.list(params), model:[eventsInstanceCount: Events.count()]
}

def show(Events eventsInstance) {
    respond eventsInstance
}

def create() {
    respond new Events(params)
}

@Transactional
def save(Events eventsInstance) {
    if (eventsInstance == null) {
        notFound()
        return
    }

    if (eventsInstance.hasErrors()) {
        respond eventsInstance.errors, view:'create'
        return
    }

    eventsInstance.save flush:true

    request.withFormat {
        form {
            flash.message = message(code: 'default.created.message', args: [message(code: 'eventsInstance.label', default: 'Events'), eventsInstance.id])
            redirect eventsInstance
        }
        '*' { respond eventsInstance, [status: CREATED] }
    }
}

def edit(Events eventsInstance) {
    respond eventsInstance
}

@Transactional
def update(Events eventsInstance) {
    if (eventsInstance == null) {
        notFound()
        return
    }

    if (eventsInstance.hasErrors()) {
        respond eventsInstance.errors, view:'edit'
        return
    }

    eventsInstance.save flush:true

    request.withFormat {
        form {
            flash.message = message(code: 'default.updated.message', args: [message(code: 'Events.label', default: 'Events'), eventsInstance.id])
            redirect eventsInstance
        }
        '*'{ respond eventsInstance, [status: OK] }
    }
}

@Transactional
def delete(Events eventsInstance) {

    if (eventsInstance == null) {
        notFound()
        return
    }

    eventsInstance.delete flush:true

    request.withFormat {
        form {
            flash.message = message(code: 'default.deleted.message', args: [message(code: 'Events.label', default: 'Events'), eventsInstance.id])
            redirect action:"index", method:"GET"
        }
        '*'{ render status: NO_CONTENT }
    }
}

protected void notFound() {
    request.withFormat {
        form {
            flash.message = message(code: 'default.not.found.message', args: [message(code: 'eventsInstance.label', default: 'Events'), params.id])
            redirect action: "index", method: "GET"
        }
        '*'{ render status: NOT_FOUND }
    }
}

}

如何过滤与特定登录相关联的每个事件?

谢谢

【问题讨论】:

    标签: grails view filtering


    【解决方案1】:

    您需要修改控制器。这是您需要编辑的行:

    respond Events.list(params), model:[eventsInstanceCount: Events.count()] 
    

    改成类似

    def myEvents = Events.findAllBySponsor(sponsor, params)
    def allMyEventsCount = Events.countBySponsor(sponsor)
    respond myEvents, model:[eventsInstanceCount: allMyEventsCount] 
    

    其中赞助商是您要过滤的用户。 (我假设登录用户是活动赞助商)

    请注意,如果您有多个事件的指定排序参数具有相同的值,则在您刷新或翻阅结果时,您的结果可能不会保持相同的顺序。防止这种情况的一种方法是使用多个排序标准,其中一个始终位于唯一值属性上,例如数据库 ID。我通常使用 Criteria 来实现这一点。我可以推荐你http://grails.org/doc/latest/guide/GORM.html#querying

    【讨论】:

    • 这是个坏主意。您正在调用 Events.findAllBySponsor(sponsor) ,然后在返回的内容上调用 .size() 。这意味着必须检索每条记录并在整个 ORM 装置中运行,以便您可以计算它们。一个更好的主意是调用 Events.countBySponsor(sponsor)。
    • 效果很好:D 谢谢
    • 我更改了答案以纳入 Jeffs 的反馈。
    • @Jeff,有类似 Events.countAllWhere() 或类似的东西吗?顺便说一句,我在 Grails 文档的 GORM 章节中找不到 countBy(),只能在参考页面中找到。
    • 没有 countAllWhere() 并且我不知道是否有等价物,因为我不知道您认为它会做什么或等价物会是什么。你可以做一些事情,比如使用 withCriteria 并表达一个计数投影。那是你要找的吗?我相信 countBy 用户指南中唯一的文档是grails.org/doc/latest/ref/Domain%20Classes/countBy.html 的文档。
    猜你喜欢
    • 1970-01-01
    • 2013-04-22
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 2018-01-09
    • 1970-01-01
    • 2011-04-22
    相关资源
    最近更新 更多