- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章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
1
|
select
test_associate.mothers.
name
from
test_associate.mothers
inner
join
test_associate.sons
on
sons.mother_id = mothers.id
where
sons.
name
=
'小李'
|
ruby代码:
1
2
3
4
5
6
7
|
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语句:
1
2
3
4
|
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代码,配置好之后, 就可以这样调用:
1
2
3
4
|
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:
1
2
3
4
5
6
7
|
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代码
1
2
3
4
|
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语句.
1
|
Student.find_by_name(
'小王'
).teachers
|
以上就是本文给大家分享的全部内容了,给出的示例也非常的简单易懂,希望大家能够喜欢.
原文链接:http://www.jianshu.com/p/ed91f63d9ae4 。
最后此篇关于ruby on rails中Model的关联详解的文章就讲到这里了,如果你想了解更多关于ruby on rails中Model的关联详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
以下是一个非常简单的ruby服务器。 require 'socket' local_socket = Socket.new(:INET, :STREAM) local_addr = Socket.
我正在使用 OS X(使用 bash),并且是 unix 的新手。我想知道是否可以修改一些文件以便运行 ruby 程序,我不需要“ruby file.rb”,而是可以运行“ruby.rb”。 有理
我在用 Ruby 替换字符串时遇到一些问题。 我的原文:人之所为不如兽之所为。 我想替换为:==What== human does is not like ==what== animal does.
我想在一个循环中从 Ruby 脚本做这样的事情: 写一个文件a.rb(每次迭代都会改变) 执行系统(ruby 'a.rb') a.rb 将带有结果的字符串写入文件“results” a.rb 完成并且
我的问题是尝试创建一个本地服务器,以便我可以理解由我的新团队开发的应用程序。我的问题是我使用的是 Ruby 2.3.3,而 Gemfile 需要 2.3.1。我无法编辑 Gemfile,因为我被告知很
我有一个使用 GLI 框架用 Ruby 编写的命令行实用程序。我想在我的主目录中配置我的命令行实用程序,使用 Ruby 本身作为 DSL 来处理它(类似于 Gemfile 或 Rakefile)。 我
我的 Rails 应用 Controller 中有这段代码: def delete object = model.datamapper_class.first(:sourced_id =>
我正在寻找的解析器应该: 对 Ruby 解析友好, 规则设计优雅, 产生用户友好的解析错误, 用户文档的数量应该比计算器示例多, UPD:允许在编写语法时省略可选的空格。 快速解析不是一个重要的特性。
我刚开始使用 Ruby,听说有一种“Ruby 方式”编码。除了 Ruby on Rails 之外,还有哪些项目适合学习并被认可且设计良好? 最佳答案 Prawn被明确地创建为不仅是一个该死的好 PDF
我知道之前有人问过类似的问题,但是我该如何构建一个无需在前面输入“ruby”就可以在终端中运行的 Ruby 文件呢? 这里的最终目标是创建一个命令行工具包类型的东西。现在,为了执行我希望用户能够执行的
例如哈希a是{:name=>'mike',:age=>27,:gender=>'male'}哈希 b 是 {:name=>'mike'} 我想知道是否有更好的方法来判断 b 哈希是否在 a 哈希内,而
我是一名决定学习 Ruby 和 Ruby on Rails 的 ASP.NET MVC 开发人员。我已经有所了解并在 RoR 上创建了一个网站。在 ASP.NET MVC 上开发,我一直使用三层架构:
最近我看到 Gary Bernhardt 展示了他用来在 vim 中执行 Ruby 代码的 vim 快捷方式。捷径是 :map ,t :w\|:!ruby %. 似乎这个方法总是执行系统 Rub
在为 this question about Blue Ruby 选择的答案中,查克说: All of the current Ruby implementations are compiled to
我有一个 Ruby 数组 > list = Request.find_all_by_artist("Metallica").map(&:song) => ["Nothing else Matters"
我在四舍五入时遇到问题。我有一个 float ,我想将其四舍五入到小数点后的百分之一。但是,我只能使用 .round ,它基本上将它变成一个 int,意思是 2.34.round # => 2. 有没
我使用 ruby on rails 编写了一个小型 Web 应用程序,它的主要目的是上传、存储和显示来自 xml(文件最多几 MB)文件的结果。运行大约 2 个月后,我注意到 mongrel 进程
我们如何用 Ruby 转换像这样的字符串: 𝑙𝑎𝑡𝑜𝑟𝑟𝑒 收件人: Latorre 最佳答案 s = "𝑙𝑎𝑡𝑜𝑟𝑟𝑒" => "𝑙𝑎𝑡𝑜𝑟𝑟𝑒" s.u
通过 ruby monk 时,他们偶尔会从左侧字段中抛出一段语法不熟悉的代码: def compute(xyz) return nil unless xyz xyz.map {|a,
不确定我做错了什么,但我似乎弄错了。 问题是,给你一串空格分隔的数字,你必须返回最大和最小的数字。 注意:所有数字都是有效的 Int32,不需要验证它们。输入字符串中始终至少有一个数字。输出字符串必须
我是一名优秀的程序员,十分优秀!