ActiveRecord :: Relation join, как добавить столбец таблицы объединения в результат запроса с новым именем? - PullRequest
4 голосов
/ 27 июля 2010

Чтобы установить сцену, я использую рельсы 3, и у меня есть эти таблицы и отношения:

user has_many lists
list has_many tasks
task has_many stints

Я хотел бы создать запрос, который позволит мне выбрать все текущие пользовательские записи,и чтобы list.id был доступен в качестве атрибута для каждого этапа в результате.Мне нужно было бы переименовать list.id в list_id, потому что в противном случае он перезаписывает атрибут id ограничения в результате.Я подумал, что «как» будет работать, но это не так.

Это дает мне последний срок, принадлежащий пользователю 1:

Stint.joins(:task => [{:list => :user }]).where(:lists => {:user_id =>  1 }).last
 => #<Stint id: 753, task_id: 245> 

Однако мне хотелось бы, чтобы:

 => #<Stint id: 753, task_id: 245, list_id: 2>

Итак, я подумал, что это сработает:

Stint.joins(:task => [{:list => :user }]).where(:lists => {:user_id =>  1 }).select('stints.*, lists.id as list_id').last
=> #<Stint id: 753, task_id: 245> 

Как видите, разницы нет.Но если я не использую «как», я получаю это:

Stint.joins(:task => [{:list => :user }]).where(:lists => {:user_id =>  1 }).select('stints.*, lists.id').last
=> #<Stint id: 2, task_id: 245> 

Используется list.id, но поскольку атрибут установлен с именем «id», он скрывает stint.id.

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

РЕДАКТИРОВАТЬ - SQL в порядке.Запрос возвращает правильные столбцы и значения, включая list_id.
Проблема заключается в том, что он не создает атрибут в модели.

1 Ответ

5 голосов
/ 28 июля 2010

Дух - решено.Атрибут был там все время.Это просто не отображалось в результате.Как глупо я себя чувствую ..

s = Stint.joins(:task => [{:list => :user }]).where(:lists => {:user_id =>  1 }).select('stints.*, lists.id as list_id').last
=> #<Stint id: 753, task_id: 245>

s.attributes
=> {"id"=>753, "list_id"=>"2", "task_id"=>245} 

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