`
bellstar
  • 浏览: 150648 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

rails关联学习笔记

阅读更多
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关联
























分享到:
评论
3 楼 hahaha168 2012-09-05  
请问如果我没有使用数据库的话,可以使用这种关联关系吗?
2 楼 fireflyman 2009-08-18  
不好意思,原來你翻譯的就是那個
1 楼 fireflyman 2009-08-18  

相关推荐

    rails查询学习笔记

    标题 "rails查询学习笔记" 涉及的是Ruby on Rails框架中的数据库查询技术。Ruby on Rails,简称Rails,是一款基于Ruby语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,使得开发Web应用更加高效...

    Ruby_On_Rails笔记

    综上所述,Ruby on Rails的笔记内容涵盖了从安装Rails环境到创建和运行一个简单的Rails项目的基础知识,这些内容对于初学者来说是学习Rails框架的极好入门材料。通过对这些知识点的学习,初学者可以快速了解Rails的...

    ruby on rails 实践

    作者鼓励读者在学习过程中注册GitHub账号,建立学习笔记仓库,以便与他人分享学习成果。书中的代码示例遵循特定的命名规则,比如命令使用小写,而作为名词时首字母大写。 《Ruby on Rails 实践》一书的著作权归作者...

    rubyinstaller-devkit-3.0.2-1-x64 and Ruby 学习笔记.7z

    总的来说,`rubyinstaller-devkit-3.0.2-1-x64 and Ruby 学习笔记.7z`文件包含了一个在Windows上开始Ruby编程所需的基本组件和学习资源。通过安装Ruby和DevKit,你可以轻松地编写、编译和运行Ruby代码,同时结合学习...

    Ruby-on-Rails-101:Ruby on Rails 笔记摘自 WDI HKV 和其他来源。 比如,lynda的在线Rails教程

    本笔记摘录自WDI HKV以及lynda.com的在线Rails教程,旨在提供一个全面且深入的学习指南。 ### 1. **基础概念** - **MVC架构**:Rails采用Model-View-Controller(MVC)设计模式,将业务逻辑(Model)、用户界面...

    rails_memo

    总的来说,Rails Memo 示例应用展示了 Rails 框架的基本工作原理和组件,为初学者提供了一个很好的起点,以便理解和学习如何使用 Rails 开发 web 应用。通过探索这个项目的源代码,可以更深入地理解 MVC 设计模式...

    ruby_on_rails_learning:我的RoR笔记本

    这个"ruby_on_rails_learning:我的RoR笔记本"是某位开发者的学习记录,反映了他从初级到进阶的过程中对RoR的理解和实践经验。 在RoR中,"模型"负责处理数据和业务逻辑,通常与数据库交互;"视图"则负责展示用户界面...

    React-Rails-Notes-app:具有Rails,PostgreSQL,React和Bootstrap的Notes应用

    通过这个项目,你可以学习到如何将React与Rails集成,理解RESTful API的工作原理,以及如何使用PostgreSQL存储数据。此外,你还可以深入了解前端开发中的状态管理、组件通信,以及如何利用Bootstrap提高开发效率。...

    oyk_2019_yaz_ruby_rails:坎普sürecindeanlatımıyapılankonularıyazılıbir kaynak haline getirerek saklar。 NotlarşuanHAMVERİaşamasındadır。 杜岑伦米米

    "杜岑伦米米"可能是创建者或项目负责人,暗示这可能是一个个人或团队的学习笔记。"HAMVERİ"阶段可能指的是项目的开发或学习进度,暗示这些材料正在进行不断的更新和改进。 Ruby on Rails(RoR)是一个基于Ruby语言...

    MemolPages:https:memolde.github.io

    它允许用户创建、编辑和分享他们的笔记,将学习过程中的点滴知识结构化,形成个人的知识库。 **Ruby语言基础** Ruby是一种面向对象的、动态类型的编程语言,由日本人松本行弘(Yukihiro Matsumoto)在1990年代末...

    notebook

    3. **Jupyter Notebook与Ruby**:虽然Jupyter Notebook主要与Python关联,但通过IRuby这个扩展,用户也可以在Jupyter环境中运行Ruby代码。IRuby提供了与Python kernel类似的交互体验,可以方便地执行Ruby代码、查看...

    TIL:今天我学到了

    这个目录可能包含了一系列关于Ruby学习的笔记、代码示例、练习项目或其他资源。 详细知识点: 1. **面向对象编程**:Ruby是一种纯面向对象的语言,所有数据都是对象,每一个操作都可以看作是对对象的方法调用。 2...

    sena:塞纳河课程中举办的讲习班

    Ruby常用于Web开发,尤其是与Rails框架结合时,是开发Web应用的高效工具。 2. **讲习班/研讨会**:在“塞纳河课程”中,通过讲习班的形式传授Ruby知识,这通常意味着实践性强、互动性高的教学方式。参与者可能学习...

Global site tag (gtag.js) - Google Analytics