Rails model 数据关联

发布于 2024-06-06 22:58:51 字数 3740 浏览 21 评论 0

为什么要关联?

为什么我们需要在两个 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 中的关联类型

在 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 多对多

belongs_to 关联

belongs_to 关联与另一个 model 建立一对一联系,这样子声明的模型的每一个实例 belongs_to 其他模型的一个实例。例如,如果你的应用程序包含客户和订单,且每一个订单会被精确的分配给一个客户,你可像这样声明这个订单 model:

class Order < ActiveRecord::Base  
  belongs_to :customer  
end

has_one 关联

has_one 关联同样是与另一个 model 建立一对一关联,但语义上有些不同(还有结果)。这种关联表明每一个 model 实例包含或者持有另一个 model 的实例。例如,如果你的应用程序里的每一个供应商仅拥有一个账号,你可像这样声明供应商 model:

class Supplier < ActiveRecord::Base  
  has_one :account  
end

has_many 关联

has_many 关联表明与另一个 model 的一对多关系。你会经常在 belongs_to 关系的“另一边”找到这种关系。这种关系表明这种 model 的每个实例拥有 0 或多个的另一个 model 的实例。例如,在一个应用程序里包含客户和订单,客户 model 可以这样声明:

class Customer < ActiveRecord::Base  
  has_many :orders  
end

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

酒儿

暂无简介

0 文章
0 评论
24 人气
更多

推荐作者

我们的影子

文章 0 评论 0

素年丶

文章 0 评论 0

南笙

文章 0 评论 0

18215568913

文章 0 评论 0

qq_xk7Ean

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文