2012-01-30 41 views
1

我是一個Rails初學者(至今也很喜歡它)。我不確定這是否是一個愚蠢的問題。 據我所知,例如,一個名爲Micropost的模型中的外鍵如下:user_id將使micropost與用戶模型的ID相關聯。就像這樣:如果Rails可以通過關聯訪問其他模型的屬性,那麼有外鍵的意義何在?

enter image description here

railtutorial.org

所以,你可以這樣做:<%= micropost.user_id %>讓誰創造了在微柱用戶的ID。

但也可以這樣做:<%= micropost.user.id %>由於Rails通過has_manybelongs_to關聯模型的能力。

  • 所以我想,爲什麼是必要的,如果web框架可以通過協會訪問其他模型的屬性反正Rails應用程序外鍵?
  • 是否有必要對它們進行索引並提高數據庫性能?
  • 或者他們需要這樣的東西:micropost.user.username可以工作嗎?

回答

0

通過調用micropost.user_id,Rails爲您提供了microposts表的user_id列的條目。 通過調用micropost.user.id,Rails從micropost獲取user_id列,併爲具有相應ID的用戶「搜索」。當你沒有user_id時,Rails不知道這兩個表之間的相關性。

2

在引擎蓋下使用外鍵使Rails協會起作用,如果沒有它們,那些協會將無法工作。您可以通過附加.to_sql的關係看這個,例如:

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

在這種情況下,它使用blog_id外鍵查詢articles關聯。

這是沒有必要索引外鍵,但這是一個好主意,並提供更好的性能。

2

所以我想知道,爲什麼Rails應用程序中需要外鍵,如果Web框架可以通過關聯訪問其他模型的屬性?

外鍵(與主鍵計數器部分)是什麼鏈接模型在一起。如果你沒有user_id你怎麼知道它最終與哪個user相關?

是否有必要爲它們編制索引並提高數據庫性能?

我覺得這種做法在性能方面很有幫助。

或者他們需要這樣的東西:micropost.user.username可以工作嗎?

這只是必要的,因爲找到相關user你需要知道它是usermicropost的上下文。

1

的關鍵是瞭解你的模型大約user VS user_iduser_id是外鍵和user實例User(比如,它的模型對象)的

沒有user_id,導軌不能使你正確的user

需要注意的是,如果你不preloading你的協會,如果你需要的是用戶ID(比如,對於建設URL),使用micropost.user_id會比micropost.user.id更快,因爲軌道將不需要實例化對象User只是爲了檢索ID。

相關問題