0

我有两个模型:

class User < ActiveRecord::Base
 has_one :user_profile
end

class UserProfile < ActiveRecord::Base
  belongs_to :user
end

aUser有一个UserProfile, aUserProfile属于 aUser

表结构:

用户

id:整数名称:字符串电子邮件:字符串

用户资料

id:整数 user_id:整数 bio:字符串 blog_url:字符串

使用 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 |

所以我在这里发现了两个不同的结果。

什么可能导致这些表未加入我的控制台?

4

1 回答 1

0

您在控制台中看到的内容:

=> [#<User id: 1, name: "Alan", email:"alan@example.com">]

是用户对象的字符串表示形式,默认表示形式不包括加载的关联(假设您有数百万个与该用户关联的其他对象 - 您根本无法获得渲染的东西)

要从用户对象访问用户配置文件,您有一个方便的#user_profile方法:

p user.user_profile

为了确保您实际上是从内存中获取这个东西而不是重新访问数据库(这是您使用 .include() 的目的),您可以跟踪 log/development.log 并查看当时没有SELECT * FROM user_profiles查询访问 user_profile 对象

你也不需要两者.joins().includes()。通常.includes()可以满足您的所有需求。

于 2013-08-07T08:28:46.157 回答