Rails Model的基本关联关系
程序员文章站
2024-02-21 15:14:04
...
原文地址为http://guides.rubyonrails.org/association_basics.html,本文非译文,只是做一下简短的介绍。(RubyChina这部分还在翻译中……)。
ActiveModel的关联系一共有以下几种
- belongs_to
- has_one
- has_many
- has_many :through
- has_one :through
- has_and_belongs_to_many
而我们通常用的关系可归类为:
- 一对一
- 一对多
- 多对一
- 多对多
对于上述四种关系,可以采用不同的表结构进行完成
belongs_to
正向属于关系,比较简单,如表A belongs_to 表B
只需要 在表A中 增加一栏以”表B名_id“的栏位即可。如果有多个栏位需要关联,则使用外键关键字进行补充即可如
class Task < ActiveRecord::Base belongs_to :user belongs_to :follower, class_name: "User", foreign_key: "follower_id" end
has_one:
反向属于关系,比如上表A和表B的关系,如果是 A--》B 是一对一,反过来 B--》 A也是一对一,那么表B有两种设计方法:
- 在表B中也增加一个表A外键使用belongs_to 关键字
- 表B中不增加任何关键字,使用has_one关键字,去关联所有表A中外键栏位与表B id一直的记录
has_many:
和has_one基本一致,一对多,多对多使用。
has_many :through :
这个特殊,拿购物车举例子, 一般购物车的设计师 cart --> cart_item --> product 这样的三层关系
cart表内是不存在任何product的外键信息,但是从关系较多来说也是一对多的。
使用has_many :through相当于借了一下cart_item中的外键关系来使用。
class Cart <ActiveRecord::Base has_many :cart_items has_many :products , through: :cart_items end class CartItem < ActiveRecord::Base belongs_to: cart has_many: products end class Product < ActiveRecord::Base end
has_one :through
同上。
has_and_belongs_to_many
除了 has_many之外另外一种多对多关系的实现。
使用Ruby Guide的例子进行说明
通过has_many :through其实也可以达到同样的效果,只不过不那么自动……
各有好处