大多数应用程序都是使用数据库的多个表的,而且一些表之间还存在着一些关联。定单
Orders有多个商品项目。一个商品项目将引用一个特殊的产品。一个产品可能属于许多不同
的产品分类目录,而每个分类目录有许多不同的产品。
数据库schema中,这些关系是由基于主键的值来表达的。[关联的另一种风格是,model
对象与它的另一个子类的model之间的关系。在253页的15.3节讨论。]如果一个商品项目
引用了一个产品,则line_items表将就包括一个列,它持有与products表中记录相对应的
主键的值。从数据库的角度来说,line_items表被说成有个外键引用了products表。
但这些都是低级别的。在我们的程序中,我们要处理model对象及它们之间的关系,而
不是数据库的记录和主键列。如果一个定单有许多的商品项目,我们喜欢有多种方式来遍历
它。如果一条商品项目和一个产品关联,我们会说这很简单,例如
price = line_item.product.price
而不是
product_id = line_item.product_id
product = Product.find(product_id)
price = product.price
Active Record可以有rescue子句。它的ORM部分的的魔力就是,它把数据库中比较底
层的外健关系转化成高层的对象间的映射。它处理三种基本的情况。
1、表A的一个记录与表B的一个或0个记录关联
2、表A的一个记录于表B的任意多个记录关联
3、表A的任意多个记录与表B的任意多个记录关联。
我们必须在Active Record处理这些内部表的关系时稍微费点神。这不是Active Record
的缺点,它不可能从含有内部表关系的模式中推断出开发人员的意图。然而,我们所要作的
事情也是很少的。
创建外键
正如前面讨论的,当一个表包含一个外健指向另一个表的主键时两个表是关联的。在下
面的DDL,表 line_items包含一个外键指向表products和表orders。
create table products (
id int not null auto_increment,
title varchar(100) not null,
/* . . . */
primary key (id)
);
create table orders (
id int not null auto_increment,
name varchar(100) not null,
/* ... */
primary key (id)
);
create table line_items (
id int not null auto_increment,
product_id int not null,
order_id int not null,
quantity int not null default 0,
unit_price float(10,2) not null,
constraint fk_items_product foreign key (product_id) references
products(id),
constraint fk_items_order foreign key (order_id) references
orders(id),
primary key (id)
);
值得注意的是:不是外键约束条件来设置关系。这些只是一个数据库的提示而已,它检
查目标表中对应的列值。DBMS一般会忽略这些约束条件。(MySQL有些版本就是这样)因为
开发人员选择从products和orders表中的值来控制列product_id和order_id的主键值,
表之间的关系就是这样非常简单的建立起来了。
查看这个DDL,我们可以看到为什么对Active Record自动猜测表之间的关系是非常困
难的。在line_items表中引用的orders和products表外键看上去是唯一的。但是,
product_id列是一个与product相关联的商品项目。order_id列是多个商品项目和一个order
相关联的。商品项目是order的一部分,但是它引用了product。
这个例子也显示了标准的Active Record命名约定。外键列应该被命名在目标表的类名
之后,并被转化为小写,再附加_id。注意,复数和附加的_id两者的转换,假设外键名字将
由引用的表不同部分组成。如果你有个Active Record model叫Person,它将映射数据库表
people。一个外键引用一些其它表到people表将有个列名叫person_id。
The other type of relationship is where some number of one thing is related
to some number of another thing (such as products belonging to multiple
categories, and categories that contain multiple products). The SQL 约定使用第三个表,叫join的表来处理它。join表包含了一个用于它连接的每个表的外键,所以join表内每行都表示两个其它表之间的连接。
create table products (
id int not null auto_increment,
title varchar(100) not null,
/* . . . */
primary key (id)
);
create table categories (
id int not null auto_increment,
name varchar(100) not null,
/* ... */
primary key (id)
);
create table categories_products (
product_id int not null,
category_id int not null,
constraint fk_cp_product foreign key (product_id) references
products(id),
constraint fk_cp_category foreign key (category_id) references
categories(id)
);
依靠schema,你可能想放置额外的信息给join表,或许是描述被加入的两个类之间自
然关系。
Rails假设一个join表被命名为两个被加入的表名字(名字按字母表次序)。Rails将自
动地找到join表categories_products来连接categories和products。如果你使用一些其
它名字,你需要添加一个声明给Rails,以便它能找到它们。
指定关系
Active Record支持三种表之间的关系类型:一对一,一对多,多对多。你可以通过在
model中加入声明has_one,has_many,belongs_to,和has_and_belongs_to_mang等来表明
关系。
一对一的关系存在于orders和invoices表之间:每个order最多有一个invoice。我
们在Rails这样来声明它
class Order < ActiveRecord::Base
has_one :invoice
. . .
class Invoice < ActiveRecord::Base
belongs_to

rder
. . .
定单和商品项目之间一对多关系:可以任意数量的商品项目与一个特定的定单关联。
ails中,我们这样编码
class Order < ActiveRecord::Base
has_many :line_items
. . .
class LineItem < ActiveRecord::Base
belongs_to

rder
. . .
我们可能要给我们的products分类。一个product属于多个类别,每个类别包含多个
roduct。这就是多对多的关系,在Rails中这表示
class Product < ActiveRecord::Base
has_and_belongs_to_many :categories
. . .
class Category < ActiveRecord::Base
has_and_belongs_to_many :products
. . .
各种连接声明要比表之间特定关联做的要更多。它们每个都可添加很多方法来帮助在
连接的对象间操作。让我们看看这三个不同种类内部连接上下文环境中的更多细节。我们
将查看考绩个方法。我们在233页图14.5中总结它们,相关的方法可查看RDoc文档。
分享到:
相关推荐
qt 一个基于Qt Creator(qt,C++)实现中国象棋人机对战.
热带雨林自驾游自然奇观探索
冰川湖自驾游冰雪交融景象
C51 单片机数码管使用 Keil项目C语言源码
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
前端分析-2023071100789s12
Laz_制作了一些窗体和对话框样式.7z
1、文件内容:ocaml-docs-4.05.0-6.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/ocaml-docs-4.05.0-6.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊
学习笔记-沁恒第六讲-米醋
工业机器人技术讲解【36页】
内容概要:本文档详细介绍了在 CentOS 7 上利用 Docker 容器化环境来部署和配置 Elasticsearch 数据库的过程。首先概述了 Elasticsearch 的特点及其主要应用场景如全文检索、日志和数据分析等,并强调了其分布式架构带来的高性能与可扩展性。之后针对具体的安装流程进行了讲解,涉及创建所需的工作目录,准备docker-compose.yml文件以及通过docker-compose工具自动化完成镜像下载和服务启动的一系列命令;同时对可能出现的问题提供了应对策略并附带解决了分词功能出现的问题。 适合人群:从事IT运维工作的技术人员或对NoSQL数据库感兴趣的开发者。 使用场景及目标:该教程旨在帮助读者掌握如何在一个Linux系统中使用现代化的应用交付方式搭建企业级搜索引擎解决方案,特别适用于希望深入了解Elastic Stack生态体系的个人研究与团队项目实践中。 阅读建议:建议按照文中给出的具体步骤进行实验验证,尤其是要注意调整相关参数配置适配自身环境。对于初次接触此话题的朋友来说,应该提前熟悉一下Linux操作系统的基础命令行知识和Docker的相关基础知识
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
网络小说的类型创新、情节设计与角色塑造
毕业设计_基于springboot+vue开发的学生考勤管理系统【源码+sql+可运行】【50311】.zip 全部代码均可运行,亲测可用,尽我所能,为你服务; 1.代码压缩包内容 代码:springboo后端代码+vue前端页面代码 脚本:数据库SQL脚本 效果图:运行结果请看资源详情效果图 2.环境准备: - JDK1.8+ - maven3.6+ - nodejs14+ - mysql5.6+ - redis 3.技术栈 - 后台:springboot+mybatisPlus+Shiro - 前台:vue+iview+Vuex+Axios - 开发工具: idea、navicate 4.功能列表 - 系统设置:用户管理、角色管理、资源管理、系统日志 - 业务管理:班级信息、学生信息、课程信息、考勤记录、假期信息、公告信息 3.运行步骤: 步骤一:修改数据库连接信息(ip、port修改) 步骤二:找到启动类xxxApplication启动 4.若不会,可私信博主!!!
在智慧城市建设的大潮中,智慧园区作为其中的璀璨明珠,正以其独特的魅力引领着产业园区的新一轮变革。想象一下,一个集绿色、高端、智能、创新于一体的未来园区,它不仅融合了科技研发、商业居住、办公文创等多种功能,更通过深度应用信息技术,实现了从传统到智慧的华丽转身。 智慧园区通过“四化”建设——即园区运营精细化、园区体验智能化、园区服务专业化和园区设施信息化,彻底颠覆了传统园区的管理模式。在这里,基础设施的数据收集与分析让管理变得更加主动和高效,从温湿度监控到烟雾报警,从消防水箱液位监测到消防栓防盗水装置,每一处细节都彰显着智能的力量。而远程抄表、空调和变配电的智能化管控,更是在节能降耗的同时,极大地提升了园区的运维效率。更令人兴奋的是,通过智慧监控、人流统计和自动访客系统等高科技手段,园区的安全防范能力得到了质的飞跃,让每一位入驻企业和个人都能享受到“拎包入住”般的便捷与安心。 更令人瞩目的是,智慧园区还构建了集信息服务、企业服务、物业服务于一体的综合服务体系。无论是通过园区门户进行信息查询、投诉反馈,还是享受便捷的电商服务、法律咨询和融资支持,亦或是利用云ERP和云OA系统提升企业的管理水平和运营效率,智慧园区都以其全面、专业、高效的服务,为企业的发展插上了腾飞的翅膀。而这一切的背后,是大数据、云计算、人工智能等前沿技术的深度融合与应用,它们如同智慧的大脑,让园区的管理和服务变得更加聪明、更加贴心。走进智慧园区,就像踏入了一个充满无限可能的未来世界,这里不仅有科技的魅力,更有生活的温度,让人不禁对未来充满了无限的憧憬与期待。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
内容概要:本文介绍了使用 Matlab 实现基于 BO(贝叶斯优化)的 Transformer 结合 GRU 门控循环单元时间序列预测的具体项目案例。文章首先介绍了时间序列预测的重要性及其现有方法存在的限制,随后深入阐述了该项目的目标、挑战与特色。重点描述了项目中采用的技术手段——结合 Transformer 和 GRU 模型的优点,通过贝叶斯优化进行超参数调整。文中给出了模型的具体实现步骤、代码示例以及完整的项目流程。同时强调了数据预处理、特征提取、窗口化分割、超参数搜索等关键技术点,并讨论了系统的设计部署细节、可视化界面制作等内容。 适合人群:具有一定机器学习基础,尤其是熟悉时间序列预测与深度学习的科研工作者或从业者。 使用场景及目标:适用于金融、医疗、能源等多个行业的高精度时间序列预测。该模型可通过捕捉长时间跨度下的复杂模式,提供更为精准的趋势预判,辅助相关机构作出合理的前瞻规划。 其他说明:此项目还涵盖了从数据采集到模型发布的全流程讲解,以及GUI图形用户界面的设计实现,有助于用户友好性提升和技术应用落地。此外,文档包含了详尽的操作指南和丰富的附录资料,包括完整的程序清单、性能评价指标等,便于读者动手实践。
漫画与青少年教育关系
励志图书的成功案例分享、人生智慧提炼与自我提升策略
人工智能在食品安全与检测中的应用