我有两种模式:
class User < ActiveRecord::Base
has_one :user_profile
end
class UserProfile < ActiveRecord::Base
belongs_to :user
end
User
有一个UserProfile
,UserProfile
属于User
表格结构:
id:整数 name:string 电子邮件:字符串
id:整数 user_id:整数 生物:字符串 blog_url:string
使用rails控制台,我尝试通过加入两个表来获取用户的信息:
User.joins(:user_profile).includes(:user_profile).where(user_profiles: {user_id: 1})
控制台屏幕上的结果仅显示User表,UserProfile表未显示。
=> [#<User id: 1, name: "Alan", email:"alan@example.com">]
控制台屏幕上出现的SQL语句(SELECT“users”。“id”bla bla ...)似乎是正确的,因为当我将其复制并粘贴到SQLite浏览器并执行命令时,它会显示给我结果如我所料。
|id| name | email | id | user_id | bio | blog_url |
------------------------------------------------------------------------------
|1 | Alan | alan@example.com | 1 | 1 | lorem ipsum | alan.example.com |
所以我在这里发现了两个不同的结果。
什么可能导致这些表无法加入我的控制台?
答案 0 :(得分:0)
您在控制台中看到的内容:
=> [#<User id: 1, name: "Alan", email:"alan@example.com">]
是User对象的字符串表示,默认表示不包含已加载的关联(想象您有与该用户关联的其他百万个对象 - 您将无法获取在全部)
从用户对象访问用户个人资料,您有一个方便的#user_profile
方法:
p user.user_profile
确保你实际从内存中取出这个东西而不是重新访问数据库(你正在使用.include())你可以尾巴log / development.log并看到没有{{1访问user_profile对象时的查询
您也不需要SELECT * FROM user_profiles
和.joins()
。通常.includes()
可以满足您的需求。