2016-01-20 3 views
0

У меня есть 2 модели: Engagement, user. Взаимодействие в основном относится к предметам, заказанным пользователем. каждое участие предназначено для конкретного пользователя. пользователь в взаимодействии имеет внешний ключ. Я хочу присоединиться к взаимодействию с пользователем, чтобы я мог видеть детали пользователя.Ruby on Rails Active Record внутреннее соединение не работает

Вот мои модели

class Engagement < ActiveRecord::Base 
    belongs_to :food_item 
    belongs_to :user 
end 
class User < ActiveRecord::Base 
    has_many :engagements 
    has_many :food_item, through: :engagements 
end 

Я бегу ниже запроса:

Engagement.joins("INNER JOIN users ON users.id = engagements.user_id") 

Это не присоединяющиеся как таблицы.

Любая помощь будет оценена

+0

что SQL Безразлично Это не так? – fengd

+0

Вы получили сообщение об ошибке? Если это так, вы можете поделиться? –

+4

Просто комментарий, Rails использует внутреннее соединение по умолчанию, поэтому вы можете сделать Engagement.joins (: user) –

ответ

0

Ваш запрос верен. Вы делаете внутреннее соединение и только возвращаете обязательства, которые имеют отношение к пользователю.

Чтобы вернуть пользовательские данные, вы должны сделать что-то вроде этого: Engagement.select('tasks.*, users.*').joins(:user). Таким образом, объект будет иметь атрибуты взаимодействия и пользователя. Но это не путь Rails.

«Правильный» способ:

engagements = Engagement.includes(:user) 
engagements.first.user # this will return the user data 

Таким образом, вы получаете все обязательства и поджимать данные пользователя, таким образом избегая п + 1 запросов (Eager-loading);)

+0

. Привет, Алекс, спасибо за ответ, попробуем и обновим – Euler

0

Попробуйте Engagement.joins(:users)

Он должен работать.

+0

@giovani над запросом также не извлекает пользовательские данные. Это дает мне тот же результат, который был указан в вопросе – Euler

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

  • Нет связанных вопросов^_^