定义ActiveRecord关联时foreign_key和primary_key有什么区别?

时间:2016-07-08 18:56:29

标签: ruby-on-rails activerecord

在ActiveRecord模型上定义关联时,我试图理解foreign_keyprimary_key之间的区别。你需要同时使用两者吗?有什么区别?

class SomeModel < ActiveRecord::Base
  has_one :something_else, foreign_key: 'some_id', primary_key: 'some_id'
end

class SomethingElse < ActiveRecord::Base
  self.primary_key = 'some_id'
  belongs_to :some_model, foreign_key: 'some_id', primary_key: 'some_id'
end

2 个答案:

答案 0 :(得分:4)

primary_key定义要用作主键的数据库字段的名称,而不是默认的id

foreign_key定义数据库字段的名称,该字段保留对另一个模型的主键字段的引用。

有关详情,请参阅Active Record Associations docs

如果您想要概念性地理解主键和外键的作用,here is one writeup就此主题。

答案 1 :(得分:1)

他们是协会的对立面。

Rails获取foreign_key的值,并使用class_name搜索带有该值primary_key的记录的模型

例如:

class PhoneNumber < ActiveRecord::Base
  belongs_to :user
end

class User < ActiveRecord::Base
  has_one :phone, foreign_key: :this_users_phone_id_field

  has_many :others_with_this_number, ->(user){where.not(id: user.id)},
     class_name:'User',
     foreign_key: :this_users_phone_id_field,
     primary_key: :this_users_phone_id_field
end

rails docs

中查看详情