Rails активно загружает, включает и атрибуты сессии - PullRequest
0 голосов
/ 11 августа 2011

У меня есть модель с миссиями, пользователями и умами. Остроумие принадлежит Миссиям и Пользователю.

Я хочу загрузить список всех миссий и хочу загрузить остроумие для конкретного пользователя. Мне нужно сделать LEFT OUTER JOIN и добавить условие в соединение. Вот что сейчас работает:

Mission.joins("LEFT OUTER JOIN wits ON wits.mission_id = missions.id AND wits.user_id = #{current_user.id}")

Тогда в моем списке я могу сделать mission.wits.first, чтобы получить остроумие, принадлежащее нужному пользователю.

Но это не очень дружелюбно к рельсам, и я должен проверить .loaded? атрибут, позволяющий не загружать все остроумие, если условие не выполняется.

Есть ли лучший способ, надеюсь, с помощью областей, чтобы сделать работу? Возможно, добавление нового виртуального атрибута в Mission, но я бы хотел избежать 20 обращений к базе данных в каждом списке.

ОБНОВЛЕНИЕ: В конце я хотел бы увидеть список миссий и для каждой миссии статус Wit для current_user. Я использую гем, называемый act_as_api, для создания представления моего списка в JSON, но я не могу получить доступ к переменной сеанса внутри модели, поэтому я смотрю на этот загружаемый материал, чтобы загрузить все, что мне нужно от контроллера.

Спасибо за вашу помощь

Ответы [ 2 ]

0 голосов
/ 11 августа 2011

Почему бы не сделать что-то вроде

Wit.includes(:mission).where(:user_id => params[:user_id])

Есть ли причина, по которой вы обращаетесь к Миссии, когда кажется, что вы действительно хотите остроумия? Также, если вы хотите получить список связанных миссий, вы можете сделать что-то подобное тоже

Wit.includes(:mission).where(:user_id => params[:user_id]).select(&:mission).uniq
0 голосов
/ 11 августа 2011

Это должно работать для вас:

Mission.joins(:wits).where(:wits => { :user_id => params[:user_id] }) Or
Mission.joins(:wits).where('wits.user_id' => params[:user_id] )
...