2013-08-07 136 views
0

我有兩種型號:滑軌:加入 'HAS_ONE' 和'belongs_to的協會

class User < ActiveRecord::Base 
has_one :user_profile 
end 

class UserProfile < ActiveRecord::Base 
    belongs_to :user 
end 

一個User具有一個UserProfileUserProfile屬於User

的表格結構:

用戶

id:整數 name:string 電子郵件:字符串

用戶配置

ID:整數 USER_ID:整數 生物:字符串 BLOG_URL:字符串

使用Rails控制檯,我嘗試通過連接兩個表來獲取用戶的信息:

User.joins(:user_profile).includes(:user_profile).where(user_profiles: {user_id: 1}) 

控制檯屏幕上的結果只顯示用戶表,UserProfile表不顯示。

=> [#<User id: 1, name: "Alan", email:"[email protected]">] 

的SQL語句出現在控制檯屏幕上(在選擇「用戶」,「ID」喇嘛喇嘛......)似乎是正確的,因爲當我複製並粘貼到瀏覽器的SQLite並執行命令,它顯示了我的預期結果。

|id| name | email   | id | user_id | bio   | blog_url   | 
------------------------------------------------------------------------------ 
|1 | Alan | [email protected] | 1 | 1  | lorem ipsum | alan.example.com | 

所以我在這裏找到了兩個不同的結果。

什麼可能導致這些表未加入我的控制檯?

回答

0

您在控制檯中看到什麼:

=> [#<User id: 1, name: "Alan", email:"[email protected]">] 

是用戶對象的字符串表示,默認表示不包括加載協會(想象一下,你有百萬與該用戶相關的其他對象 - 你止跌」 T爲能夠得到)

在所有呈現的東西,從用戶對象訪問用戶的個人資料你可以很方便#user_profile方法:

p user.user_profile 

要確定你實際上是從內存中獲取這個東西,而不是重新訪問數據庫(這就是你使用.include()for)的內容,你可以tail log/development.log並看到沒有SELECT * FROM user_profiles查詢訪問user_profile對象的時間

同樣您不需要同時使用.joins().includes()。通常.includes()做你需要的一切。瞭解。

+0

瞭解。所以當我需要顯示相關對象的值時,我可能不得不使用'user.user_profile.blog_url'之類的東西。 – Abednego

+0

。它是獨立的對象,它們具有不同的屬性集合,這些屬性通過這些對象上的相應方法公開。 – keymone