cfwheels - 使用复合键表更新嵌套属性

时间:2012-05-04 21:08:47

标签: coldfusion composite-key cfwheels

我正在尝试使用嵌套属性来更新模型。

现在在我的编辑视图中,我手动定义textFieldTag,通过将名称设置为"myModel[myNestedProperty][#modelID#,#key2id#][name]"

来创建params结构

在更新操作中......

如果我只使用myModel.update(params.myModel)如果有任何需要删除的元素,我就无法使更新生效

所以我销毁了与myModel具有相同id的嵌套属性的所有模型,在这种情况下它可以工作。

缺点是如果更新失败,嵌套属性都会消失。

在尝试删除所有模型并.save之前,我先尝试抓取所有模型,但由于某种原因,这些模型无效。

看起来cfwheel是为这种与复选框的关系设置的,但我需要它来处理textfield并选择表单中的项目。


更新

我意识到我有另一个问题。基本上我想扩展它,以便能够跨多个嵌套属性和关系使用它。

问题在于我设置名称的方式,特别是对于选择下拉菜单:

name="myModel[myNestedProperty][#modelID#, ][nestedID]"

问题是第二个id无法声明,因为它将被指定为id而不是使用我选择的值。

说实话,这是我一直在与我争斗的一个问题。我正在通过重新生成控制器中的模型来处理它,我只是忘了我还没有解决这个问题。

有没有办法让我可以根本不使用这些值,并动态地从结构中填充它们?

假设我已经(截断)了一个名称tcat[34,0][catID]tcat[34,][catID],(其中catID应该是第二个ID)。

生成的params的tcat结构是

[34,0]{catID = 12,14,18}

[34,]{catID = 12,14,18}

我希望params的tcat结构有多个结构,如:

[34,12]{tID = 34; catID = 12}
[34,14]{tID = 34; catID = 14}
[34,18]{tID = 34; catID = 18}

有解决方法吗?

我正在使用许多复合键嵌套属性,如果我可以让这部分单独工作,它会使它变得容易多了。我知道一种方法是使用javascript更新名称,但我认为这将是(非常,非常)最后的手段。

1 个答案:

答案 0 :(得分:1)

你可以尝试一下吗?

在父模型中设置一个回调,检查name是否为空,如果为空,则标记为删除。

<cffunction name="init">
    ...

    <!--- This could also be `beforeValidation` if you want to make `name` required for the child model --->
    <cfset beforeSave("$provisionMyNestedProperty")>
</cffunction>

<cffunction name="$provisionMyNestedProperty">
    <cfscript>
        if (StructKeyExists(this, "myNestedProperty") && IsArray(this.myNestedProperty))
        {
            for (local.i = 1; local.i <= ArrayLen(this.myNestedProperty); local.i++)
            {
                if (!StructKeyExists(this.myNestedProperty[local.i], "name") || !Len(Trim(this.myNestedProperty[local.i].name)))
                    this.myNestedProperty[local.i]._delete = true;
            }
        }
    </cfscript>
</cffunction>

我会继续编辑我的答案,直到我们能够找到解决方案。希望这会给你一个良好的开端。