当前位置: 代码网 > it编程>前端脚本>Ruby > ruby on rails中Model的关联详解

ruby on rails中Model的关联详解

2024年05月15日 Ruby 我要评论
前言:在学习model关联之前,首先要牢记一下几点:1.关联关系,两端都要写好,否则会出现初学者看不懂的错误。而且对于理解代码,非常有好处。2.model的名字是单数,controller是复数。3.

前言:
在学习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

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

(0)

相关文章:

  • Redis集群搭建全记录

    Redis集群搭建全记录

    redis集群是一个提供在多个redis节点间共享数据的程序集。  redis集群中不支持处理多个keys的命令。  redis集群通过分区来提供一定程度的可用... [阅读全文]
  • 使用Ruby实现FTP密码破解

    这篇文章我将带大家利用ruby,来构建我们自己的ftp密码破解器。并希望通过这个例子,让大家明白暴力攻击的概念及其重要性。好了话不多说,下面让我们开始吧!何为暴力攻击?暴力攻击这个…

    2024年05月15日 前端脚本
  • mac及linux下搭建ruby+rails环境

    mac及linux下搭建ruby+rails环境

    mac通常会自带ruby一个版本的ruby环境, 比如我的是2.0.0。 如果项目需要的版本巧好和自己的默认版本一样,就不用折腾安装其他版本了。 如果不一样, ... [阅读全文]
  • 在Mac OS X下安装Ruby运行环境的详细步骤

    在Mac OS X下安装Ruby运行环境的详细步骤

    前言ruby是一种功能强大的面向对象的脚本语言,它综合了perl,python,java等语言的特点写成,有强大的文字处理能力,简单的语法,并且完全的面向对象。... [阅读全文]
  • Rails实现字段加密存储

    Rails实现字段加密存储

    方案存储前,加密后再存储到数据库读取后,利用 key 进行解密实现activesupport::messageencryptor 是 rails 基于 open... [阅读全文]
  • Ruby实现的图片滤镜算法代码

    原图一、灰度算法彩色照片每一个像素的颜色值由红、绿、蓝三种值混合而成,红绿蓝的取值分别由很多种,于是像素的颜色值也可以有很多种颜色值,这就是彩色图片的原理,而灰度照片则只有256种…

    2024年05月15日 前端脚本

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com