Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 外键:属于&;有一点不同吗_Ruby On Rails_Ruby_Associations_Models - Fatal编程技术网

Ruby on rails 外键:属于&;有一点不同吗

Ruby on rails 外键:属于&;有一点不同吗,ruby-on-rails,ruby,associations,models,Ruby On Rails,Ruby,Associations,Models,我不明白这两种关联类型的区别 例如,我们有两个表: 拳击手 [ id, name, title ] [ id, name ] 标题 [ id, name, title ] [ id, name ] 因此,我们可以通过以下方式指定关联: boxer.rb belongs_to :title, forign_key: "title" 然后像Boxer.find(1.title.name)一样使用它 从逻辑上讲,每个拳击手都有一个头衔记录,每个头衔都有许多拳击手 那么,我们为什么不指定有一个

我不明白这两种关联类型的区别

例如,我们有两个表:

拳击手

[ id, name, title ]
[ id, name ]
标题

[ id, name, title ]
[ id, name ]
因此,我们可以通过以下方式指定关联:

boxer.rb

belongs_to :title, forign_key: "title"
然后像Boxer.find(1.title.name)一样使用它

从逻辑上讲,每个拳击手都有一个头衔记录,每个头衔都有许多拳击手


那么,我们为什么不指定
有一个
有多个
关系呢?当我指定
属于:title,forign\u键:“title”
时,这意味着在我的例子中,FK指向表boxers(boxer.rb)。但是当我试图写
时,有一个:title,forign键:“title”
,它在
titles
表中搜索列
title
。为什么?

一般来说,如果你没有提及任何事情,只需写下以下内容:

class Boxer < ActiveRecord::Base
  belongs_to :title
end
class Boxer < ActiveRecord::Base
  belongs_to :title, foreign_key: 'title'
end
boxer.title
;它进入
titles
表,并在其中搜索
id
与调用方法
boxer.title
的对象中存储的
boxer\u id
相同的行

如果不在模型中指定
外键
,则会出现这种情况

但是如果您确实指定了一个
外键
,如下所示:

class Boxer < ActiveRecord::Base
  belongs_to :title
end
class Boxer < ActiveRecord::Base
  belongs_to :title, foreign_key: 'title'
end
class-Boxer
现在,在
boxers
表中,必须有一列
title
来存储它所属的
id


不同之处在于:如果不指定
外键
,它将查找
标题id
,但当指定
外键
时,它将搜索该外键

将带有外键索引的模型上的
所属
放入另一个模型中。在另一个模型上,您将
放在has\u one
中。这两种方法都允许覆盖fk列的名称,但它始终位于表中的
所属\u to

我用这个技巧来记住:


一只狗属于他的主人(而不是相反),主人有一只狗。狗戴着印有主人号码的id标签,而不是相反

我认为这种混乱可能源于你的模型之间的关联有点违反直觉。你是说每个
拳击手
都有一个
标题
,但是每个
标题
可能有多个
拳击手
,对吗?在这种情况下,虽然我们会直观地谈论属于拳击手的头衔,但实际上你的联想应该是相反的:每个头衔都有许多拳击手,每个拳击手都属于一个头衔。因此:

# title
has_many :boxers

# boxer
belongs_to :title
如果在Rails中有一个
有一个
有多个
关联,则另一侧必须始终有
属于
,并且这应该在另一个表具有外键的模型上。从上面可以看出,Rails通常假定
boxers
表有一个名为
title\u id
的列,该列对应于
titles
id
列中的值。考虑到您还没有这样做,您需要提供额外的信息,以便Rails能够正确处理关联

具体地说,您需要告诉Rails Boxer模型使用的是
title
作为外键,并且这对应于title的
name

# title
has_many :boxers, primary_key: :name, foreign_key: :title

# boxer
belongs_to :title, foreign_key: :title

我建议改为使用更标准的设置,删除boxer上的
title
字段,使用
title\u id
。这可能也值得一看,因为其中有很多关于这一切到底是如何运作的细节。

是的,我理解所有这些,但问题是关于有一个。当在一个关联中指定FK时,FK的行为不同。它将在其他表中搜索您用FK指定的列。所以
有一个:title,外键:'title'
不会在boxers中搜索
title
,而是在titles表中搜索。我不明白为什么?外键总是存在于属于另一个表的表中。例如,计算机
属于用户,计算机中将存在外键。在您的例子中,
title
属于
boxer
,因此显然,外键应该存在于
titles
表中,而这就是它存在的地方。好的,找到了。但是,
have\u one
,它期望FK在哪里呢?就像在您的例子中,
boxer
have\u one
title
,因此默认情况下,
boxer
将在
titles
表中查找名为
boxer\u id
的键,而不是在
boxers
表中。当你说,boxer
有一个:title,foreign\u key:title
,这个名为
boxer\u id
的键现在将被替换为
title
键,因为这就是你在代码中提到的。请始终记住,FK存在于
属于另一个表的表中。最重要的是,如果在标题模型中指定了
外键
,则还必须在其他模型中指定相同的外键:Boxer,否则它将不适用于当前场景。