Rails:加入'has_one'和'belongs_to'关联

时间:2013-08-07 07:36:46

标签: ruby-on-rails has-and-belongs-to-many

我有两种模式:

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: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 |

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

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

1 个答案:

答案 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()可以满足您的需求。