2015-05-28 2 views
1

Я пишу заявку на работу. Существует таблица Users, где пользователи могут размещать вакансии или запрашивать рабочие места. Поэтому моя таблица Jobs имеет поле user_id для пользователя проводки и отношение к таблице Job_requests, у которой есть job_id и user_id, но здесь user_id является идентификатором запрашивающего пользователя.Rails вложенные включает и принадлежит_to против has_one

Я пытаюсь показать работу, отправленный пользователем:

current_user.jobs.find(params[:id]) 

включая просьбы о той работе:

current_user.jobs.includes(:job_requests).find(params[:id]) 

, но и в том числе детали для запрашивающего пользователя:

current_user.jobs.includes(job_requests: :user).find(params[:id]) 

Первые две работы, но третья ошибка со следующей погрешностью:

SQLException (no such column: users.job_request_id) 

Я знаю, что такого столбца нет. Я ищу информацию о пользователе, который отправил запрос.

Модель Ассоциация

User 
has_many :jobs, dependent: :destroy 
has_many :job_requests 

Job 
belongs_to :user 
has_many :job_requests 

JobRequest 
has_one :user 
has_one :job 
+0

Ну .. Ваш запрос? –

+0

Для работы, которую я разместил, я хочу, чтобы запрашивающие лица с их данными – Mika

+0

использовали ваш файл schema.rb? – uday

ответ

1

Для следующих ассоциаций:

# User 

has_many :jobs, dependent: :destroy 
has_many :job_requests 

# Job 

belongs_to :user 
has_many :job_requests 

# JobRequest 

belongs_to :user 
belongs_to :job 

Ваш запрос будет:

current_user.jobs.includes(job_requests: :user).find(params[:id]) 

belongs_to & has_one:

Единственная разница в том, на какой стороне отношений вы находитесь. Если у User есть Profile, то в модели User вам необходимо иметь has_one :profile, а в модели Profile вам необходимо иметь belongs_to :user.

Вы можете определить, у кого есть другой объект, посмотрев, где находится внешний ключ. Вы можете сказать, что User имеет Profile, потому что таблица profiles имеет столбец user_id. Если в таблице users есть столбец под названием profile_id, мы скажем, что Profile имеет User.

Для дальнейшего изучения вы можете прочитать это article.

+0

Я думаю, вы имеете в виду: 'job_requests:: user' так, как вы его написали. Я получаю сообщение от пользователя. Кроме того, не возражаете ли вы объяснить разницу между has_one и belongs_to, чтобы сделать ответ более полным и твердым? – Mika

+0

@Mikael, конечно, я собираюсь обновить свой ответ, обсудив разницу между 'has_one' и' belongs_to'. –

+0

У вас все еще есть typo ': job_request,: user', а не' job_request:: user' – Mika

2

В job_request.rb добавьте следующую строку ассоциация

belongs_to :user 
belongs_to :job_request 

belongs_to используется, когда вы храните внешний ключ конкретной модели. Когда has_one используется в то время, вы не храните внешний ключ другой таблицы.

Запрос должен быть

JobRequest.includes (:user, :job).where ('job_requests.job_id = ? and job_requests.user_id = ? ', params [:id], current_user.id)

+0

@mikael проверить с помощью запроса –

+0

Мой первоначальный запрос работает сейчас, когда я исправил варианты – Mika