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 onetitle
,因此默认情况下,boxer
将在titles
表中查找名为boxer\u id
的键,而不是在boxers
表中。当你说,boxer有一个:title,foreign\u key:title
,这个名为boxer\u id
的键现在将被替换为title
键,因为这就是你在代码中提到的。请始终记住,FK存在于属于另一个表的表中。最重要的是,如果在标题模型中指定了外键
,则还必须在其他模型中指定相同的外键:Boxer,否则它将不适用于当前场景。