ActiveRecord :: Relation join,如何使用新名称将连接表的列添加到查询结果中?

时间:2010-07-27 14:55:18

标签: sql activerecord join ruby-on-rails-3

要设置舞台,我使用的是rails 3,我有这些表和关系:

user has_many lists
list has_many tasks
task has_many stints

我想构建一个查询,允许我选择所有当前用户的stints,并让list.id作为结果中每个stint的属性。我需要将list.id重命名为list_id,否则它会覆盖结果中stint的id属性。我认为“as”会起作用,但事实并非如此。

这给了我属于用户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> 

正如你所看到的,没有区别。但如果我不使用“as”,我会得到这个:

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 个答案:

答案 0 :(得分:5)

呃 - 呃 - 解决了。这个属性一直存在。它只是没有显示在结果中。我觉得多么愚蠢..

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"