首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

精通 Grails 使用 Ajax 实现多对多关系(2)

精通 Grails 使用 Ajax 实现多对多关系(2)

多对多关系的实际效用现在,就绪的对象模型可以很好地模拟真实世界。我一年中要经历许多旅行,经历许多不同的航空公司,飞往许多不同的机场。将所有这些关系联系起来的就是一个 Flight。
查看一下底层数据库,我只看到了期望看到的表,如清单 7 中的 MySQL show tables 命令的输出所示:
清单 7. 底层数据库表
1
2
3
4
5
6
7
8
9
mysql> show tables;
+----------------+
| Tables_in_trip |
+----------------+
| airline        |
| airport        |
| flight         |
| trip           |
+----------------+




airline、airport 和 trip 表中的所有列均与对应的域类中的字段匹配。flight 是连接表,表示其他表之间的复杂关系。清单 8 展示了 Flight 表中的字段:
清单 8. Flight 表中的字段
1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> desc flight;
+----------------------+--------------+------+-----+
| Field                | Type         | Null | Key |
+----------------------+--------------+------+-----+
| id                   | bigint(20)   | NO   | PRI |
| version              | bigint(20)   | NO   |     |
| airline_id           | bigint(20)   | YES  | MUL |
| arrival_airport_id   | bigint(20)   | NO   | MUL |
| arrival_date         | datetime     | NO   |     |
| departure_airport_id | bigint(20)   | NO   | MUL |
| departure_date       | datetime     | NO   |     |
| flight_number        | varchar(255) | NO   |     |
| trip_id              | bigint(20)   | YES  | MUL |
+----------------------+--------------+------+-----+




用于创建新 Flight 的搭建的 HTML 页面为所有的相关表提供了组合框,如图 1 所示:
图 1. 用于添加航班而搭建的 HTML 页面调优用户界面迄今为止,m:m 讨论的焦点一直围绕如何使用类和数据库表模拟关系。我希望您能够看到,科学就是一门艺术。作为 Grails 开发人员,您可以利用许多出色的技巧来改进关系的行为和副作用。现在将焦点转移到用户界面上,您将会看到一些非常优秀的方法,使用它们调整 m:m 关系的显示。
正如我在前一节中演示的,默认情况下,Grails 使用选择字段来显示 1:m 关系。这个起点还不错,但是您可能想在不同的环境中使用其他 HTML 控件。选择字段只显示当前值;您必须下拉该列表才能查看所有可能的值。尽管这在可用屏幕空间非常有限的情况下是最佳选择,但您可能会觉得使所有的选项都显示出来是一种更好的解决方案。单选按钮适合于显示所有可能的选择并将选择限制为单个值。复选框显示所有可能的选择并允许选择多个选项。
所有这些控件都适合显示数量有限的选择,但它们不能扩展到数百或数千个可能值。例如,如果我需要向最终用户提供全世界所有的航空公司(大约 650 家),没有一种标准 HTML 控件能够处理这么大的数据量。这时就需要开发人员做出判断了。对于这个应用程序,我不需要显示所有 650 家航空公司。我一生中飞过的不同航空公司可能还不到 12 家。在一些情况下,使用选择字段显示航空公司选项很可能就足够了。
要了解 Grails 如何为        Airline 创建选择字段,请输入        grails generate-views Flight。查看一下        grails-app/views/flight/create.gsp。选择字段是使用 <g:select> 标记在一行代码中生成的。如果不熟悉 Grails TagLibs,请参阅 。清单 9 展示了使用中的 <g:select> 字段:
清单 9. 使用中的 <g:select> 字段
1
2
3
4
<g:select optionKey="id"
          from="${Airline.list()}"
          name="airline.id"
          value="${flight?.airline?.id}" ></g:select>




在 Web 浏览器中选择 View > Source 查看这是如何呈现的,如清单 10 所示:
清单 10. 呈现的选择字段
1
2
3
4
5
<select name="airline.id" id="airline.id" >
<option value="1" >UAL - United Airlines</option>
<option value="2" >DAL - Delta</option>
<option value="3" >COA - Continental</option>
</select>




<g:select> 标记的        optionKey 属性指定一个 类的哪个字段将会存储在关系的另一端的多个 字段的值中。Airline 表的主键(airline.id)会作为 Flight 表的外键。在选择字段中,请注意 airline.id 是可选值(调用 Airline.toString() 方法来显示值)。如果您想要更改选项的排列顺序,可以将 GORM 调用由        Airline.list() 更改为 Airline.listOrderByIata()、        Airline.listOrderByName() 或想要使用的任何其他字段。
返回列表