我是Rails的初学者(到目前为止还爱它)。我不确定这是不是一个愚蠢的问题。
据我所知,一个外键,例如,像名为Micropost的模型中的user_id
将微博与用户模型的ID相关联。像这样:
所以你可以这样做:<%= micropost.user_id %>
来获取创建微博的用户的ID。
但也可以执行此操作:<%= micropost.user.id %>
由于Rails能够通过has_many
和belongs_to
关联模型。
micropost.user.username
可以工作?答案 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对这两个表之间的相关性一无所知。