要设置舞台,我使用的是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 问题是它不会在模型上创建属性。
答案 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"