有人一直弄不清楚,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