全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

ruby on rails中Model的关联详解

前言:
在学习model关联之前,首先要牢记一下几点:
1.关联关系,两端都要写好,否则会出现初学者看不懂的错误。而且对于理解代码,非常有好处。
2.model的名字是单数,controller是复数。
3.blong_to后面必须是单数,而且必须是小写。has_many后面必须是复数。

一:一对多

例如:
王妈妈有两个孩子,小明和小亮。可以说,王妈妈,有多个孩子。也可以说:小明,有一个妈妈;小王,有一个妈妈。我们一般在设计表的时候,是这样设计的:
mothers表中id和name
sons表中有id和name
为了增加逻辑关系,主外键关系,会在多的一方,增加一列,所以sons表中有三列,id和name和mother_id(对应了mothers表的id)
普通SQL:

select test_associate.mothers.name from test_associate.mothers inner join test_associate.sons on sons.mother_id = mothers.id where sons.name = '小李'

ruby代码:

class Mother 
 has_many :sons 
end 

class Son 
 belongs_to :mother 
end

解释:一个妈妈又多个孩子,一个儿子属于一个妈妈。
我们在rails console可以测试下:
xiao_wang = Son.first 
mom = xiaowang.mother

这个 .mother 方法就是由 class Son的belongs_to :mother这句话生成的。
也就是相当于转换成了一下的sql语句:

select * from mothers 
  join sons 
  on sons.mother_id = mothers.id 
  where sons.id = 1

详细解释:

A:belongs_to :mother
B:belongs_to :mother, :class => 'Mother', :foreign_key => 'mother_id'
A=B

这个就是Rails最典型的根据惯例来编程,声明哪个表对应的是哪个class,再在class之间声明好关联关系。
1.belongs_to :mother, rails就能判断出: mothers 表,是一的那一端。 而当前class 是: "class Son", 那么rails 就知道了 两个表的对应关系。
2.:class => 'Mother', 表示, 一的那一端, 对应的model class是Mother. 根据rails的惯例, Mother model对应的是 数据库中的 mothers 表。
3.:foreign_key => 'mother_id', rails就知道了, 外键是 'mother_id'. 而一对多关系中, 外键是保存在 多的那一端(也就是 sons, 所以说,在 sons表中, 必须有一个列, 叫做: mother_id )
所以, 这个复杂的SQL 条件就齐备了, 可以生成了。
上面的ruby代码,配置好之后, 就可以这样调用:

son = Son.first
son.mother # .mother方法, 是由 class Son 中的 belongs_to 产生的。
mother = Mother.first
mother.sons  # .sons 方法, 是由 class Mother 中的 hash_many 产生的。

二:一对一,比较简单,也不常用,这里不介绍。(老公和老婆)

三:多对多

例如:
一个学生,有多个老师,(学习了多门课程)
一个老师,可以教多个孩子(教一门课程,但是有好多学生来听这个课程)
我们往往会这样做:
students有id和name两个字段
teachers有id和name两个字段
放在任何一个表中都不合适,这是我们需要一张中间表,也就是桥梁表。
lessons有id和name和student_id和teacher_id
原始SQL:

select teachers.*, students.*, lessons.* 
  from lessons from teachers , 
  join teachers 
  on lessons.teacher_id = teachers.id 
  join students 
  on lessons.student_id = students.id  
  where students.name = '小王'

Ruby代码:

class Student 
 has_many :lessons 
 has_many :teachers, :through => :lessons 
end

提示:has_many :teachers, :through => :lessons 相当于
has_many :teachers, :class => 'Teacher', :foreign_key => 'teacher_id', :throught => :lessons
class Teachers 
  has_many :lessons 
  has_many :students, :through => :lessons 
end

查看小王的老师有哪些,同上面的原始SQL语句。

Student.find_by_name('小王').teachers

以上就是本文给大家分享的全部内容了,给出的示例也非常的简单易懂,希望大家能够喜欢。


# ruby  # on  # rails  # 教程  # model关联  # Windows下Ruby on Rails开发环境安装配置图文教程  # ruby on rails 代码技巧  # 攻克CakePHP(PHP中的Ruby On Rails框架)图文介绍  # 在阿里云 (aliyun) 服务器上搭建Ruby On Rails环境  # 在Ruby on Rails中使用AJAX的教程  # CentOS中配置Ruby on Rails环境  # win7安装ruby on rails开发环境  # 小王  # 多个  # 是由  # 的是  # 有一个  # 可以说  # 中有  # 小明  # 这是  # 知道了  # 关联关系  # 也不  # 成了  # 放在  # 都要  # 就能  # 是这样  # 会在  # 这句话  # 这样做 


相关文章: 制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  视频网站app制作软件,有什么好的视频聊天网站或者软件?  如何在阿里云香港服务器快速搭建网站?  如何在宝塔面板中创建新站点?  长沙做网站要多少钱,长沙国安网络怎么样?  建站主机与服务器功能差异如何区分?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  如何用VPS主机快速搭建个人网站?  高端建站如何打造兼具美学与转化的品牌官网?  如何快速搭建高效WAP手机网站?  如何配置IIS站点权限与局域网访问?  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  电商平台网站制作流程,电商网站如何制作?  北京网站制作网页,网站升级改版需要多久?  非常酷的网站设计制作软件,酷培ai教育官方网站?  高防服务器如何保障网站安全无虞?  建站VPS选购需注意哪些关键参数?  学校免费自助建站系统:智能生成+拖拽设计+多端适配  如何通过宝塔面板实现本地网站访问?  如何高效配置香港服务器实现快速建站?  网站制作公司广州有几家,广州尚艺美发学校网站是多少?  如何制作网站标识牌,动态网站如何制作(教程)?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  制作网站公司那家好,网络公司是做什么的?  南京网站制作费用,南京远驱官方网站?  如何高效配置IIS服务器搭建网站?  攀枝花网站建设,攀枝花营业执照网上怎么年审?  企业微网站怎么做,公司网站和公众号有什么区别?  C#怎么创建控制台应用 C# Console App项目创建方法  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  如何在服务器上三步完成建站并提升流量?  济南网站制作的价格,历城一职专官方网站?  如何在阿里云完成域名注册与建站?  怎么将XML数据可视化 D3.js加载XML  已有域名和空间,如何快速搭建网站?  如何续费美橙建站之星域名及服务?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  西安专业网站制作公司有哪些,陕西省建行官方网站?  seo网站制作优化,网站SEO优化步骤有哪些?  广州商城建站系统开发成本与周期如何控制?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  定制建站哪家更专业可靠?推荐榜单揭晓  自助网站制作软件,个人如何自助建网站?  简历在线制作网站免费版,如何创建个人简历?  黑客如何利用漏洞与弱口令入侵网站服务器?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  如何选择CMS系统实现快速建站与SEO优化?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  C#如何序列化对象为XML XmlSerializer用法 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。