有人一直弄不清楚,has_one 与 belongs_to 的 primary_key 与 foreign_key 要如何设置。于是我就这么解释了!!!
class User < ApplicationRecord
# 当user是主人时, dog是主人的附属品时,应这样设置
has_one :dog
has_one :dog, primary_key: :id, foreign_key: :user_id
# 当我们没有定义任何的primary_key与 foreign_key时
# rails会默认拿user的主键id 与 dog的外键user_id进行关联,即 primary_key: :id, foreign_key: :user_id
# 为什么是拿dog的user_id进行关联,因为rails默认外键的规则是: 表名_主键
# 所以以上两种定义是等价的
end
class Dog < ApplicationRecord
# 以下两种定义也是等价的
belongs_to :user
belongs_to :user, primary_key: :id, foreign_key: :user_id
# 这时候,新人就会有疑问了,怎么两个model中的primary_key与foreign_key是一样的
# 为什么不是默认设置成:
belongs_to :user, primary_key: :id, foreign_key: :dog_id
end
class User < ApplicationRecord
=begin 表结构
+-----------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+----------------------+------+-----+---------+----------------+
| id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(21) | NO | UNI | | |
+-----------+----------------------+------+-----+---------+----------------+
=end
has_one :dog
# 当遇到dog这张表中没有 user_id时
# 如果使用以上关联,则会报错,因为dog表中没有rails默认外键 user_id
# 此时,如果要成功建立关联,则需要手动指定外键
# 当dog表中的外键字段是master_id,则需要这样设置:
has_one :dog, foreign_key: :master_id
end
class Dog < ApplicationRecord
=begin 表结构
+-----------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+----------------------+------+-----+---------+----------------+
| id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| master_id | int(11) unsigned | NO | UNI | | |
+-----------+----------------------+------+-----+---------+----------------+
=end
#同样的也需要指明foreign_key,否则通过默认规则会报错
belongs_to :user, foreign_key: :master_id
end