The Six Types of Rails Association

翻译 2013年08月13日 21:36:18

翻译整理自:http://guides.rubyonrails.org/v3.2.13/association_basics.html

想吐槽一句,http://guides.ruby-china.org/  翻译地太慢了!!!

csdn 复制过来格式都有误啊,改格式改了好几遍了。烦心。。。。

什么时候能支持markdown呢-。-


Rails支持以下6种关联类型:

  • belongs_to
  • has_one
  • has_many
  • has_many :through
  • has_one :through
  • has_and_belongs_to_many
1. belongs_to :在两个model间建立一对一的关系
class Order < ActiveRecord::Base
  belongs_to :customer
end
意味着每一个order能且只能被赋给一个customer。

2. has_one :同样在两个model间建立一对一的关系,但语义和结果有点区别
意味着一个model的每个实例含有或拥有另一个model的一个实例。
class Supplier < ActiveRecord::Base
  has_one :account
end
个人理解:有点像是和belongs_to相反的关系,一个是属于,一个是拥有。

3. has_many :和另一个模型有着一对多的关系,经常和belongs_to成对出现
意味着一个模型每个实例有0个或多个另一模型的实例。
class Customer < ActiveRecord::Base
  has_many :orders
end
注意: 此处order为复数形式。

4. has_many :through 经常被用来和另一个模型建立多对多的关系
原model可以通过(through)第三方model和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

5. has_one :through  一对一的关系,与上一个类似,原model可以通过第三方model和1个另一model的实例相匹配。
举例:每个供应商有一个账号,每个账户有一个相关联的账号历史,关系定义如下:
class Supplier < ActiveRecord::Base
  has_one :account
  has_one :account_history, :through => :account
end
 
class Account < ActiveRecord::Base
  belongs_to :supplier
  has_one :account_history
end
 
class AccountHistory < ActiveRecord::Base
  belongs_to :account
end

6. has_and_belongs_to_many :直接和另一个model建立多对多的关系,不再通过中间model
例如,每个配件有很多个部分,每个部分出现在很多个配件中,定义如下:
class Assembly < ActiveRecord::Base
  has_and_belongs_to_many :parts
end
 
class Part < ActiveRecord::Base
  has_and_belongs_to_many :assemblies
end


到底该选用哪一种关系呢???
1. 该选用 has_one 还是 belongs_to ?
区别在于你在哪里放置了foreign key
ps : foreign key(外键):父数据表(Parent Entity)的主键(primary key)会放在另一个数据表,当做属性以创建彼此的关系,而这个属性就是外键。参考:http://www.w3school.com.cn/sql/sql_foreignkey.asp
如:Orders表中的customer_id就是Orders表的外键,而order_id是主键。
举例说明:Supplier 和 account 的关系
class Supplier < ActiveRecord::Base
  has_one :account
end
 
class Account < ActiveRecord::Base
  belongs_to :supplier
end
为什么是这样呢?从正常逻辑思维来看,它确实应该如此,另外它的数据迁移文件可能长这样:
class CreateSuppliers < ActiveRecord::Migration
  def change
    create_table :suppliers do |t|
      t.string :name
      t.timestamps
    end
 
    create_table :accounts do |t|
      t.integer :supplier_id
      t.string  :account_number
      t.timestamps
    end
  end
end
一看就知道 supplier_id 是accouts表的外键,所以,关系定义确实是对的。


2. 该选用 has_many :through 还是 has_and_belongs_to_many ?
它们其实是Rails提供的两种声明多对多关系的方法。后者更简单些,它允许你直接定义多对多关系。

例子见上面,如果你需要将关系模型作为一个独立的数据表而且不需要对该关系模型做任何处理的话,使用
has_and_many是比较简单的,尽管你还要在数据库中建立一个连接表(joining table),比如 assemblies_parts表。

但是如果在连接模型中你需要数据验证(validations),回调函数(callbacks),或者其他参数时,你就应该使用has_many :through这种方式了。

3. 多态关联(polymorphic association)
A model can belong to more than one other model, on a single association.
For example, you might have a picture model that belongs to either an employee model or a product model.
class Picture < ActiveRecord::Base
  belongs_to :imageable, :polymorphic => true
end
 
class Employee < ActiveRecord::Base
  has_many :pictures, :as => :imageable
end
 
class Product < ActiveRecord::Base
  has_many :pictures, :as => :imageable
end


4. 自我连接(self joins)

有时候你需要一个model,它的内部之间也有联系。
比如你想把所有的雇员都存放在一个单独的数据库模型中,但它同时又能跟踪经理和下属的关系。
可以这样定义:
class Employee < ActiveRecord::Base
  has_many :subordinates, :class_name => "Employee",
    :foreign_key => "manager_id"
  belongs_to :manager, :class_name => "Employee"
end

这样一来,你就可以获取 @employee.subordinates 和 @employee.manager 了。


不想写地太长,所以只摘取了其中部分,另外能力有限,有些部分没能翻译。
今天在大神的点拨下基本完成了数据关系的设计, 嘿嘿, 感谢HalFtaN, 开开心心做国创去咯 ^_^

欢迎各位指正 :)


poj 2139Six Degrees of Cowvin Bacon

Six Degrees of Cowvin Bacon Time Limit: 1000MS   Memory Limit: 65536K Total Submissi...
  • sky_zdk
  • sky_zdk
  • 2017年02月28日 17:38
  • 147

Six Degrees of Separation

题目: “六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论。这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多...

Charpter six Applications of internet

Keywords: VPN 虚拟专用网 public network 公用网 gateway 网关 router 路由器 firewall 防火墙 protocol 协议 link 链路...

【图论floyd】 poj 2139 Six Degrees of Cowvin Bacon

/*奶牛演电影,演同一部电影的奶牛距离为一,求一个到所有奶牛距离和最小的 奶牛,结果为ans*100/(n-1) n为奶牛数,m为电影数 每行第一个数为参演这部电影的奶牛数 */ #inclu...

POJ2139-Six Degrees of Cowvin Bacon

题目:POJ2139 Six Degrees of Cowvin Bacon Time Limit: 1000MS   Memory Limit: 65536K ...

POJ2139 Six Degrees of Cowvin Bacon 最短路

这题水题,就是将出现在同一动画的

POJ - 2139 Six Degrees of Cowvin Bacon(任意两点最短路,Floyd)

题目传送门 题意:奶牛们最近要拍电影了…… 1、若两个的奶牛一起工作则,他们相互的度(degrees)为; 2、若两只奶牛a、b不一起工作,但与另有一只奶牛都和他们工作,则a、b的相互的度为2。...

POJ 2139 Six Degrees of Cowvin Bacon Floyd最短路

POJ2139 Description The cows havebeen making movies lately, so they are ready to play a variant of...

POJ 2139 Six Degrees of Cowvin Bacon【floyd】

Six Degrees of Cowvin Bacon Time Limit: 1000MS   Memory Limit: 65536K To...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:The Six Types of Rails Association
举报原因:
原因补充:

(最多只允许输入30个字)