如何根据数据库码表生成下拉列表?

在数据库中存在包含大量数据的“产品码”表:code_product(pro_code,pro_name)

“事实表”中存放产品代码如:

id   product     cost     date_created

1    010101     23.5     2010-01-01

问题:如何使用inList方式实现下拉列表如

010101 产品A

010102 产品B

.........

除此之外有没有更好的办法封装大量的码表作为下拉列表,谢谢!

首先,我得纠正一下你的观点。“inList”本身的目的是验证,而不是为了生成下拉列表,那个只是它的副业。否则,“inList”就不应该出现约束中,而应属于Taglib,同时名字恐怕也得换一下了。

从你的需求来看,“事实表”跟“产品码”表之间是存在关联关系的,假设两表对应的Domain Class分别为:Fact和Product。

class Fact{
    Product product
    ...
}

class Product{
    ...
}

这样,当你使用grails generate-all时,对于Fact,Grails会自动创建一个Product的下拉列表。当然,这种方式在Product有很多的情况下,并不是最佳的,数据传输会花很常时间,而且前台页面也会占大量的内存。对于大规模的数据,根本就没法使用。此时,就得想其他方法。

最典型的做法是使用“Ajax+控制返回数据数量”。这时,应用就得针对Product选择进行单独处理,接受前台的Ajax请求,然后将结果返回。同时,前台页面的界面也得配合进行修改。常用的UI设计一般有

  • 使用AutoComplete,这个YUI的例子,我想应该是很适合你的需要的。因为业务人员一般对产品码也比较熟悉,有时还嫌选择麻烦,期望直接输入。参考地址:http://developer.yahoo.com/yui/examples/autocomplete/ac_itemselect.html
  • 使用ComboBox,这里有一个jQuery的插件,非常不错,而且实现了分页。这样即使是对于超大规模的数据,应付起来也不成问题。也很适合你的这种情况,同样是可以输入可以选择。参考地址:http://www.usamimi.info/~sutara/acbox_demo/english.php。虽然他的例子后台是php写的,但是改成Grails也不会太难。

根据以上进行前后台修改之后,你还得实现一个自定义的validator,因为这时你已经没有使用所谓的inList了。附带说一句,“inList”约束也不是针对关系来用的,它最适合的是选项已知并且确定的情况下,如“性别”,其对应的选项就是“男/女”。

以上就是解决这类问题的基本思路,期望对你有帮助。

By 匿名用户 - Posted on 29 十月 2010