Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何更改生成表中的列顺序(grails约束不适用于mongodb插件)_Mongodb_Grails_Scaffolding - Fatal编程技术网

如何更改生成表中的列顺序(grails约束不适用于mongodb插件)

如何更改生成表中的列顺序(grails约束不适用于mongodb插件),mongodb,grails,scaffolding,Mongodb,Grails,Scaffolding,我将Grails2.1.1与mongodb插件一起使用。我无法更改生成列表中列的顺序。如上所述,您只需要在CONTAINTS块中正确地排列属性 我的域名: class Section { String idName String visible String required String name String bold static embedded = ['question'] List<Question> questions static hasMany = [ques

我将Grails2.1.1与mongodb插件一起使用。我无法更改生成列表中列的顺序。如上所述,您只需要在CONTAINTS块中正确地排列属性

我的域名:

class Section {

String idName
String visible
String required
String name
String bold

static embedded = ['question']

List<Question> questions
static hasMany = [questions : Question]

static constraints = {
    idName (blank: false)
    name (blank: false)
    visible (blank: false)
    required (blank: false)
    bold (blank: false)
}

@Override
public String toString() {
    name
}
}

你知道我如何更改它以获得我在约束中设置的工作顺序吗?

约束应该按照你所描述的更新视图。尝试运行
grailsgenerateall--stacktrace
脚本可能在相应地更新视图之前终止。另一个策略是检查问题是否存在于下面的语句中,因此排除它们并检查视图是否相应更新可能会使您更接近于解决问题

static embedded = ['question']

List<Question> questions
static hasMany = [questions : Question]
static embedded=['question']
列出问题
静态hasMany=[问题:问题]

希望这有帮助

经过一些测试后,我确信只使用mongodb插件而不使用hibernate插件会导致禁用一些脚手架功能。例如,在生成视图时忽略了constraints子句。要实现这一点,您需要使用hibernate。 因此,如果您希望拥有自动生成的代码,并且仍然使用mongodb,有一个技巧:
使用hibernate创建、生成并完成项目,然后在生产中卸载hibernate并安装mongodb。

应填写jira问题。看

void generateView(GrailDomainClass domainClass,字符串viewName,Writer out){
def templateText=getTemplateText(${viewName}.gsp)
如果(模板文本){
def t=engine.createTemplate(templateText)
def multiPart=domainClass.properties.find{it.type==([]作为字节[]).class | | it.type==([]作为字节[]).class}
布尔hasHibernate=pluginManager?.hasGrailsPlugin('hibernate'))
def packageName=domainClass.packageName?”:“”
def binding=[pluginManager:pluginManager,
packageName:packageName,
domainClass:domainClass,
多部分:多部分,
类名:domainClass.shortName,
propertyName:getPropertyName(domainClass),
渲染器:渲染器,
比较器:hasHibernate?DomainClassPropertyComparator:SimpleDomainClassPropertyComparator]
t、 make(绑定)。writeTo(输出)
}
}
显然,调用generate View决定使用SimpleDomainClassPropertyComparator。Grails最初是为了依赖hibernate而构建的。在过去几年中,世界一直在使用额外的持久性机制。如果您查看DomainClassPropertyComparator,就会发现它不依赖于hibernate。我觉得代码应该测试domainObject是否“有约束”,以决定默认情况下使用哪个比较器或简单使用DomainClassPropertyComparator。如果未找到约束,则其行为相同。DefaultGrailTemplateGenerator不需要调用“hasHibernate”

作为一种解决方法,您可以安装scaffolding模板,编辑_form.gsp并将其用于DomainClassPropertyComparator的比较器更改为 e、 g.我的普惠制表格

    <%=packageName%>
<% import grails.persistence.Event %>
<% import org.codehaus.groovy.grails.scaffolding.DomainClassPropertyComparator %>


<%  excludedProps = Event.allEvents.toList() << 'version' << 'dateCreated' << 'lastUpdated'
    persistentPropNames = domainClass.persistentProperties*.name
    boolean hasHibernate = pluginManager?.hasGrailsPlugin('hibernate')
    if (hasHibernate && org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsDomainBinder.getMapping(domainClass)?.identity?.generator == 'assigned') {
        persistentPropNames << domainClass.identifier.name
    }

DomainClassPropertyComparator mattsComparator = new DomainClassPropertyComparator(domainClass)
comparator = mattsComparator

props = domainClass.properties.findAll { persistentPropNames.contains(it.name) && !excludedProps.contains(it.name) }
    Collections.sort(props, comparator)
    for (p in props) {
        if (p.embedded) {
            def embeddedPropNames = p.component.persistentProperties*.name
            def embeddedProps = p.component.properties.findAll { embeddedPropNames.contains(it.name) && !excludedProps.contains(it.name) }
            Collections.sort(embeddedProps, comparator)
            %><fieldset class="embedded"><legend><g:message code="${domainClass.propertyName}.${p.name}.label" default="${p.naturalName}" /></legend><%
                for (ep in p.component.properties) {
                    renderFieldForProperty(ep, p.component, "${p.name}.")
                }
            %></fieldset><%
        } else {
            renderFieldForProperty(p, domainClass)
        }
    }

private renderFieldForProperty(p, owningClass, prefix = "") {
    boolean hasHibernate = pluginManager?.hasGrailsPlugin('hibernate')
    boolean display = true
    boolean required = false
    if (hasHibernate) {
        cp = owningClass.constrainedProperties[p.name]
        display = (cp ? cp.display : true)
        required = (cp ? !(cp.propertyType in [boolean, Boolean]) && !cp.nullable && (cp.propertyType != String || !cp.blank) : false)
    }
    if (display) { %>
<div class="fieldcontain \${hasErrors(bean: ${propertyName}, field: '${prefix}${p.name}', 'error')} ${required ? 'required' : ''}">
    <label for="${prefix}${p.name}">
        <g:message code="${domainClass.propertyName}.${prefix}${p.name}.label" default="${p.naturalName}" />
        <% if (required) { %><span class="required-indicator">*</span><% } %>
    </label>
    ${renderEditor(p)}
</div>
<%  }   } %>


如果在模板中注释下面的行并重新生成视图,则约束中的顺序将与脚手架中的顺序相同

//Collections.sort(props, comparator.constructors[0].newInstance([domainClass] as Object[]))

Option
--stacktrace
没有提供任何更多信息,但我确信脚本结束正确,因为更改域中的字段后,视图会在gsp文件中更新。对于来自我的域的这些“其他语句”,我在我的项目中创建了新的简单域来测试脚手架:
类简单{String zzz String kkk String aaa static constraints={kkkk()zzz()aaa()}
但是在生成新视图之后,gsp页面中列和字段的顺序仍然是字母顺序。我认为更多的是关于配置或这个mongodb插件,而不仅仅是我的域定义。我在相同的环境下启动了新的grails项目(但没有更改为mongodb),并按约束排序。所以我几乎可以肯定卸载hibernate插件和/或安装mongodb插件会有问题。我检查一下,然后在这里给出答案。
    <%=packageName%>
<% import grails.persistence.Event %>
<% import org.codehaus.groovy.grails.scaffolding.DomainClassPropertyComparator %>


<%  excludedProps = Event.allEvents.toList() << 'version' << 'dateCreated' << 'lastUpdated'
    persistentPropNames = domainClass.persistentProperties*.name
    boolean hasHibernate = pluginManager?.hasGrailsPlugin('hibernate')
    if (hasHibernate && org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsDomainBinder.getMapping(domainClass)?.identity?.generator == 'assigned') {
        persistentPropNames << domainClass.identifier.name
    }

DomainClassPropertyComparator mattsComparator = new DomainClassPropertyComparator(domainClass)
comparator = mattsComparator

props = domainClass.properties.findAll { persistentPropNames.contains(it.name) && !excludedProps.contains(it.name) }
    Collections.sort(props, comparator)
    for (p in props) {
        if (p.embedded) {
            def embeddedPropNames = p.component.persistentProperties*.name
            def embeddedProps = p.component.properties.findAll { embeddedPropNames.contains(it.name) && !excludedProps.contains(it.name) }
            Collections.sort(embeddedProps, comparator)
            %><fieldset class="embedded"><legend><g:message code="${domainClass.propertyName}.${p.name}.label" default="${p.naturalName}" /></legend><%
                for (ep in p.component.properties) {
                    renderFieldForProperty(ep, p.component, "${p.name}.")
                }
            %></fieldset><%
        } else {
            renderFieldForProperty(p, domainClass)
        }
    }

private renderFieldForProperty(p, owningClass, prefix = "") {
    boolean hasHibernate = pluginManager?.hasGrailsPlugin('hibernate')
    boolean display = true
    boolean required = false
    if (hasHibernate) {
        cp = owningClass.constrainedProperties[p.name]
        display = (cp ? cp.display : true)
        required = (cp ? !(cp.propertyType in [boolean, Boolean]) && !cp.nullable && (cp.propertyType != String || !cp.blank) : false)
    }
    if (display) { %>
<div class="fieldcontain \${hasErrors(bean: ${propertyName}, field: '${prefix}${p.name}', 'error')} ${required ? 'required' : ''}">
    <label for="${prefix}${p.name}">
        <g:message code="${domainClass.propertyName}.${prefix}${p.name}.label" default="${p.naturalName}" />
        <% if (required) { %><span class="required-indicator">*</span><% } %>
    </label>
    ${renderEditor(p)}
</div>
<%  }   } %>
//Collections.sort(props, comparator.constructors[0].newInstance([domainClass] as Object[]))