开发者

ActiveRecord::Relation join, how to add a column of a join table to the query result with a new name?

To set the stage, I'm using rail开发者_如何学Pythons 3 and I have these tables and relationships:

user has_many lists
list has_many tasks
task has_many stints

I would like to build a query that allows me to select all of the current users stints, and to have the list.id available as an attribute on each stint in the result. I would need to rename list.id to list_id because otherwise it overwrites the id attribute of the stint in the result. I figured "as" would work, but it doesn't.

This gives me the last stint belonging to user 1:

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

What I would like however, is:

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

So I figured this would work:

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 you can see, no difference. But if I don't use "as", I get this:

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

The list.id is used, but because the attribute is set with the name "id" it hides the stint.id.

Any help would be appreciated.

EDIT - The SQL is fine. The query returns the correct columns and values, including list_id.

The problem is that it doesn't create an attribute on the model.


The attribute was there all along. It just wasn't being displayed in the result.

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" 
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜