http://guides.rubyonrails.org/association_basics.html
1、为什么要关联?
为什么我们需要在两个model之间建立关联?因为它让通用操作变得简单和容易。例如,考虑有一个rails应用程序包含一个customer model和一个order model。每一个customer有很多的order。没有关联时,model声明如下:
class Customer < ActiveRecord::Base
end
class Order < ActiveRecord::Base
end
现在,假设我们想为一个已存在的客户添加一个新的订单,我们需要像这样做:
@order = Order.create(:order_date => Time.now, :customer_id => @customer.id)
再考虑在删除一个客户时,确保他的订单也被删除了。
@orders = Order.find_by_customer_id(@customer.id)
@orders.each do |order|
order.destroy
end
@customer.destroy
使用Active Record关联,我们通过声明告诉Rails在这两个model之间存在的关联使这些及其他一些操作流线化,这里是建立customer model和order model的改进代码
class Customer < ActiveRecord::Base
has_many :orders, :dependent => :destroy
end
class Order < ActiveRecord::Base
belongs_to :customer
end
有了这些改变,很容易实现为一个特定的客户创建一个订单
@order = @customer.orders.create(:order_date => Time.now)
删除一个客户和它的订单则更加容易
@customer.destroy
欲学习更多不同类型的关联,阅读本手册的下一节。
下一节内容有关使用关联的一些建议和戏法,
以及一份完整的有关rails中关联的方法、选项的参考。
2、关联类型
在Rails中,关联是两个Active Record Model之间的连接,关联通过macro-style的调用来实现的,因此你可以声明来添加特性到你的model。例如,通过声明一个model belongs_to另一个,你的Rails指令去维护在两个model的实例之间的Primay-Key_Foreign Key信息,然后你同时有许多有用的方法添加到了你的model中。Rails支持六种类型的关联:
- belongs_to 从属关系
- has_one 拥有(一对一)
- has_many 拥有(一对多)
- has_many :through 一对多,通过中间关联
- has_one :through 一对一,通过中间关联
- has_and_belongs_to_many 多对多
在本手册的剩下部分,你将会学到如何声明和使用各种形式的关联。但首先,快速的介绍下每一种关联类型的情况是必要的。
2.1、belongs_to关联
belongs_to关联与另一个model建立一对一联系,这样子声明的模型的每一个实例belongs_to其他模型的一个实例。例如,如果你的应用程序包含客户和订单,且每一个订单会被精确的分配给一个客户,你可像这样声明这个订单model:
class Order < ActiveRecord::Base
belongs_to :customer
end
2.2、has_one关联
has_one关联同样是与另一个model建立一对一关联,但语义上有些不同(还有结果)。这种关联表明每一个model实例包含或者持有另一个model的实例。例如,如果你的应用程序里的每一个供应商仅拥有一个账号,你可像这样声明供应商model:
class Supplier < ActiveRecord::Base
has_one :account
end
2.3、has_many关联
has_many关联表明与另一个model的一对多关系。你会经常在belongs_to关系的“另一边”找到这种关系。这种关系表明这种model的每个实例拥有0或多个的另一个model的实例。例如,在一个应用程序里包含客户和订单,客户model可以这样声明:
class Customer < ActiveRecord::Base
has_many :orders
end
2.4、has_many :through关联
has_many :through关联通常用于和另一个model建立多对多关联。
这种关系表明这样声明的model可以通过through处理匹配0或多个另一个model的实例。例如,考虑一个有关病人预约内科医生的医学练习,相关的声明可能像这样:
class Physician < ActiveRecord::Base
has_many :appointments
has_many :patients, :through => :appointments
end
class Appointment < ActiveRecord::Base
belongs_to :physician
belongs_to :patient
end
class Patient < ActiveRecord::Base
has_many :appointments
has_many :physicians, :through => :appointments
end
has_many :through关联同样有益于建立"快捷方式"通过嵌套的has_many关联。例如,如果一个文章有多个章节,而每个章节有很多段落,你也许有时想得到一个文档中所有段落的简单集合。你可以这种方式设置:
class Document < ActiveRecord::Base
has_many :sections
has_many :paragraphs, :through => :sections
end
class Section < ActiveRecord::Base
belongs_to :document
has_many :paragraphs
end
class Paragraph < ActiveRecord::Base
belongs_to :section
end
2.5、has_one :through关联
分享到:
相关推荐
标题 "rails查询学习笔记" 涉及的是Ruby on Rails框架中的数据库查询技术。Ruby on Rails,简称Rails,是一款基于Ruby语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,使得开发Web应用更加高效...
综上所述,Ruby on Rails的笔记内容涵盖了从安装Rails环境到创建和运行一个简单的Rails项目的基础知识,这些内容对于初学者来说是学习Rails框架的极好入门材料。通过对这些知识点的学习,初学者可以快速了解Rails的...
作者鼓励读者在学习过程中注册GitHub账号,建立学习笔记仓库,以便与他人分享学习成果。书中的代码示例遵循特定的命名规则,比如命令使用小写,而作为名词时首字母大写。 《Ruby on Rails 实践》一书的著作权归作者...
总的来说,`rubyinstaller-devkit-3.0.2-1-x64 and Ruby 学习笔记.7z`文件包含了一个在Windows上开始Ruby编程所需的基本组件和学习资源。通过安装Ruby和DevKit,你可以轻松地编写、编译和运行Ruby代码,同时结合学习...
本笔记摘录自WDI HKV以及lynda.com的在线Rails教程,旨在提供一个全面且深入的学习指南。 ### 1. **基础概念** - **MVC架构**:Rails采用Model-View-Controller(MVC)设计模式,将业务逻辑(Model)、用户界面...
总的来说,Rails Memo 示例应用展示了 Rails 框架的基本工作原理和组件,为初学者提供了一个很好的起点,以便理解和学习如何使用 Rails 开发 web 应用。通过探索这个项目的源代码,可以更深入地理解 MVC 设计模式...
这个"ruby_on_rails_learning:我的RoR笔记本"是某位开发者的学习记录,反映了他从初级到进阶的过程中对RoR的理解和实践经验。 在RoR中,"模型"负责处理数据和业务逻辑,通常与数据库交互;"视图"则负责展示用户界面...
通过这个项目,你可以学习到如何将React与Rails集成,理解RESTful API的工作原理,以及如何使用PostgreSQL存储数据。此外,你还可以深入了解前端开发中的状态管理、组件通信,以及如何利用Bootstrap提高开发效率。...
"杜岑伦米米"可能是创建者或项目负责人,暗示这可能是一个个人或团队的学习笔记。"HAMVERİ"阶段可能指的是项目的开发或学习进度,暗示这些材料正在进行不断的更新和改进。 Ruby on Rails(RoR)是一个基于Ruby语言...
它允许用户创建、编辑和分享他们的笔记,将学习过程中的点滴知识结构化,形成个人的知识库。 **Ruby语言基础** Ruby是一种面向对象的、动态类型的编程语言,由日本人松本行弘(Yukihiro Matsumoto)在1990年代末...
3. **Jupyter Notebook与Ruby**:虽然Jupyter Notebook主要与Python关联,但通过IRuby这个扩展,用户也可以在Jupyter环境中运行Ruby代码。IRuby提供了与Python kernel类似的交互体验,可以方便地执行Ruby代码、查看...
这个目录可能包含了一系列关于Ruby学习的笔记、代码示例、练习项目或其他资源。 详细知识点: 1. **面向对象编程**:Ruby是一种纯面向对象的语言,所有数据都是对象,每一个操作都可以看作是对对象的方法调用。 2...
Ruby常用于Web开发,尤其是与Rails框架结合时,是开发Web应用的高效工具。 2. **讲习班/研讨会**:在“塞纳河课程”中,通过讲习班的形式传授Ruby知识,这通常意味着实践性强、互动性高的教学方式。参与者可能学习...