2013-08-07 2 views
0

У меня есть две модели:Rails: присоединение к 'HAS_ONE' и "belongs_to ассоциация

class User < ActiveRecord::Base 
has_one :user_profile 
end 

class UserProfile < ActiveRecord::Base 
    belongs_to :user 
end 

User имеет один UserProfile, а UserProfile принадлежит User

Таблицах структурой:

id: integer имя: строка электронная почта: строка

UserProfile

ID: целое user_id: целое био: строка BLOG_URL: строка

Использование рельсов консоли, я стараюсь, чтобы получить информацию Пользователя путем объединения обеих таблиц:

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

Результат на экране консоли показывает мне только таблицу User, таблица UserProfile не отображается.

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

SQL-оператор, который появился на экране консоли (выбранный «пользователи». «Ид» бла-бла ...) кажется правильным, так как, когда я скопировать и вставить его в 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]">] 

является строкой представлением объекта пользователя, представление по умолчанию не включает в себя загруженные ассоциаций (представьте, что вы имели миллиона других объектов, связанные с этим пользователем - Wouldn» т быть в состоянии получить вещь вынесенной на всех)

доступ профиля пользователя из объекта пользователя у вас есть удобный #user_profile метод:

p user.user_profile 

Чтобы убедиться, что вы действительно извлекаете эту вещь из памяти и не пересматриваете базу данных (для чего вы используете .include()), вы можете tail log/development.log и посмотреть, что нет SELECT * FROM user_profiles запросов на время, когда вы обращаетесь к объекту user_profile

также не нужны как .joins(), так и .includes(). обычно .includes() делает все, что вам нужно.

+0

Понял. Поэтому, когда мне нужно отобразить значение из связанного объекта, мне, возможно, придется использовать что-то вроде 'user.user_profile.blog_url'. – Abednego

+0

точно. это отдельные объекты, которые имеют различный набор атрибутов, которые отображаются через соответствующие методы для этих объектов. – keymone

Смежные вопросы