如果Rails可以通过关联访问其他模型的属性,那么拥有外键有什么意义呢?

时间:2012-01-30 14:41:06

标签: ruby-on-rails

我是Rails的初学者(到目前为止还爱它)。我不确定这是不是一个愚蠢的问题。 据我所知,一个外键,例如,像名为Micropost的模型中的user_id将微博与用户模型的ID相关联。像这样:

enter image description here

railtutorial.org

所以你可以这样做:<%= micropost.user_id %>来获取创建微博的用户的ID。

但也可以执行此操作:<%= micropost.user.id %>由于Rails能够通过has_manybelongs_to关联模型。

  • 所以我想知道,如果Web框架可以通过关联访问其他模型的属性,为什么Rails应用程序中需要外键?
  • 是否有必要对它们编制索引并提高数据库性能?
  • 或者它们是否必要,以便像这样:micropost.user.username可以工作?

4 个答案:

答案 0 :(得分:2)

外部密钥用于使Rails关联工作,如果没有它们,这些关联将无法工作。您可以通过将.to_sql附加到Relation来看到这一点,例如:

> Blog.first.articles.to_sql
=> "SELECT `articles`.* FROM `articles`  WHERE `articles`.`blog_id` = 42"

在这种情况下,它使用blog_id外键来查询articles关联。

没有必要索引外键,但这是一个好主意,并提供更好的性能。

答案 1 :(得分:2)

  

所以我想知道,如果Web框架可以通过关联访问其他模型的属性,为什么Rails应用程序中需要外键?

外键(以及主键计数器部分)是模型的 链接 。如果您没有user_id,您如何知道最终与哪个user相关联?

  

是否有必要对它们编制索引并提高数据库性能?

我发现这种做法对于表现很有帮助。

  

或者它们是否必要,以便像这样:micropost.user.username可以工作?

只有在上下文中才能找到micropost关联的user您需要知道哪个user

答案 2 :(得分:1)

在模型中了解user vs user_id的关键是user_id是外键,而user实例 User的一个(例如,它是模型对象)。

如果没有user_id,则rails无法为您生成正确的user

请注意,如果您不是preloading您的关联,如果您只需要用户ID(例如,对于构建网址),则使用micropost.user_id将比micropost.user.id更快因为rails不需要实例化User对象只是为了检索id。

答案 3 :(得分:0)

通过调用micropost.user_id,Rails为您提供了微博表的user_id列的条目。 通过调用micropost.user.id,Rails从micropost获取user_id列并“搜索”具有相应id的用户。当你没有user_id时,Rails对这两个表之间的相关性一无所知。