Jul*_*ann 4 sql activerecord join ruby-on-rails-3
要设置阶段,我使用rails 3,我有这些表和关系:
user has_many lists
list has_many tasks
task has_many stints
Run Code Online (Sandbox Code Playgroud)
我想构建一个查询,允许我选择所有当前用户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>
Run Code Online (Sandbox Code Playgroud)
但我想要的是:
=> #<Stint id: 753, task_id: 245, list_id: 2>
Run Code Online (Sandbox Code Playgroud)
所以我认为这样可行:
Stint.joins(:task => [{:list => :user }]).where(:lists => {:user_id => 1 }).select('stints.*, lists.id as list_id').last
=> #<Stint id: 753, task_id: 245>
Run Code Online (Sandbox Code Playgroud)
如你所见,没有区别.但如果我不使用"as",我会得到:
Stint.joins(:task => [{:list => :user }]).where(:lists => {:user_id => 1 }).select('stints.*, lists.id').last
=> #<Stint id: 2, task_id: 245>
Run Code Online (Sandbox Code Playgroud)
使用了list.id,但由于该属性设置为名称"id",因此它隐藏了stint.id.
任何帮助,将不胜感激.
编辑 - SQL很好.查询返回正确的列和值,包括list_id.
问题是它不会在模型上创建属性.
呃 - 解决了.这个属性一直存在.它只是没有显示在结果中.我觉得多么愚蠢
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"
Run Code Online (Sandbox Code Playgroud)