我知道外键用于指定子类上具有不同列名(与父子类名不同)的时间。我知道主键和外键是什么,并且多次读取关联的rails文档,但我无法弄清楚主键选项的用途。
1)但是什么是primary_key选项?如何在调用关联时更改sql?
2)在什么情况下你需要在关联时指定primary_key?
3)在什么情况下你需要同时指定primary_key和foreign_key?
下面的是在关联上指定foreign_key选项的示例:
class User
has_many :texts, foreign_key: :owner_id
end
class Text
belongs_to :user, foreign_key: :owner_id
end
User Table
id| name |
Text Table
id| owner_id |name
答案 0 :(得分:2)
Rails使用约定优于配置。
按照惯例,rails中的所有数据库表都有id
列的主键。
如果由于某些奇怪的原因(例如,您已经拥有旧数据库),您的表格使用了不同的主键id
...您使用primary_key
调用告诉rails它是什么。
按照惯例,所有关联都使用<model>_id
的外键作为外键。
如果由于某种原因,您的关联使用不同的外键来查找关联的模型 - 您可以使用foreign_key
来告诉我们它是什么。
与primary_key
不同,使用foreign_key
可能更为常见。特别是当您有多个关联使用相同的表但具有不同的关联名称时。
答案 1 :(得分:2)
好的,所以我想了解更多有关SQL的信息并想出来了。当您的孩子具有不同的foreign_key名称,而父母的classname_id在您的父表上,但您仍然使用ID作为您的标识符时,可以使用foreign_key选项。
user table
id|name|age
text table
id|random_id|conversations
select * from user where user.id = text.random_id
select * from text where text.random_id (foreign_key) = account.id (primary key)
另一方面,如果您不想使用id链接关系,则可以将primary_key与foreign_key一起使用。
user table
id|userable_id|name|age
text table
id|userable_ss_id|conversations
此处:如果您想将userable_ss_id链接到userable_id,则在两个关系中都包含primary_key和foreign_key选项。
class User
has_many :texts, primary_key: :userable_ss_id, foreign_key: :userable_id
end
class Text
belongs_to :user, primary_key: :userable_ss_id, foreign_key: :userable_id
end
基本经验法则:
select * from text where text.(foreign_key) = account.(primary key)
答案 2 :(得分:0)
主键关注主表和外键关联的
您已正确使用外键。如果对于isntance,用户有另一个主键:id u&#39; d必须指定。
#User
has_many :texts, primary_key: :uuid, foreign_key: owner_id
所以你需要这个选项,如果你想要另一个键的命名,而不是相应的主要和相关表的轨道约定