精通 Grails 使用 Ajax 实现多对多关系(2)
 
- UID
- 1066743
|

精通 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() 或想要使用的任何其他字段。 |
|
|
|
|
|