Rails关联primary_key选项

时间:2014-06-15 23:48:52

标签: ruby-on-rails associations primary-key rails-activerecord model-associations

我知道外键用于指定子类上具有不同列名(与父子类名不同)的时间。我知道主键和外键是什么,并且多次读取关联的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

3 个答案:

答案 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

所以你需要这个选项,如果你想要另一个键的命名,而不是相应的主要和相关表的轨道约定