其实rails关联类型之间都有许多联系和推演,从这个角度去看,比较容易理解
has_many VS has_one
has_many through VS has_and_belongs_to_many
多态关联
1、一个model 同时属于多个其它model
2、表中 通过xx_id、xx_type 区分 它存的是哪个model的信息(xx_type中是model名)
class Picture < ApplicationRecord
belongs_to :imageable,:polymorphic => true
end
class Product < ApplicationRecord
has_many :pictures
end
class Person < ApplicationRecord
has_many :pictures
end
单表继承
1、它们是model间继承
2、由于这几个model数据相似性,非常高,所以用一张表来搞定
3、表中用type(存model名) 来区分哪个model的数据
class Vehicle < ApplicationRecord
end
class Car < Vehicle
end
class Motorcycle < Vehicle
end
PS:命令写法rails g model car --parent=Vehicle
自联结
所谓自关联即:自己和自己关联。
主要是通过 class_name、foreign_key 来设定关联行为
class Person < ApplicationRecord
has_many :subordinates, :class_name => 'Person',:foregin_key => 'manager_id'
belongs_to :manager,:class_name => 'Person'
# class_name 类名大写
# 外键能通过 方法名 推导出来就不用写
end