Соединения activerecord для Ruby on rails - выбор полей из нескольких таблиц - PullRequest
2 голосов
/ 06 августа 2011

Модель:

#StatusMessage model
class StatusMessage < ActiveRecord::Base
  belongs_to :users
  default_scope :order => "created_at DESC"
end


#User Model
class User < ActiveRecord::Base
  has_many :status_messages 
end

В контроллере я хочу объединить эти две таблицы и получить поля из обеих таблиц. например, я хочу email поле от User и status поле от StatusMessage. Когда я использую:

@status = User.joins(:status_messages)

Или

@status = User.includes(:status_messages)

Это дает мне только данные таблицы пользователя.

Как я могу реализовать это требование?

Ответы [ 3 ]

6 голосов
/ 06 августа 2011

Вам нужно использовать includes здесь.Он предварительно загружает данные, поэтому при выполнении @user.status_messages.

у вас не будет другого SQL-запроса. И да, вы не сможете увидеть эффект: вам нужно проверить свои журналы.

2 голосов
/ 06 августа 2011

Прежде всего, я не думаю, что это возможно (и разумно), что вы хотите сделать. Причина этого заключается в том, что отношение между User и StatusMessage равно 1: n, что означает, что каждый пользователь может иметь от 0 до n сообщений о состоянии. Как эти множества атрибутов должны быть включены в вашу пользовательскую модель?

Я думаю, что метод joints в классе ActiceRecord имеет другое значение, он является частью интерфейса запроса . Смотрите вопрос LEFT OUTER включается в Rails 3

В сети есть похожие вопросы, вот что я нашел, что больше всего соответствует:

  • Ruby on Rails: как объединить две таблицы : Включает (переведено для вашего примера) в пользователя primary_status_message, который затем материализуется в запросе для пользователя. Но он содержится в одном атрибуте, и для доступа к атрибутам status_message вы должны сделать что-то вроде этого: @user.primary_status_message.status
1 голос
/ 15 октября 2012

Когда вы используете @status = User.includes (: status_messages), rails eagerley загружает данные всех таблиц.

Моя точка зрения заключается в том, что при использовании этого User.include (: status_messages) он будет загружатьсяданные status_messages также, но показывают только данные таблицы пользователей, тогда, если вы хотите первого пользователя status_messages, тогда вам нужно @ user.first.status_messages

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...