如何在activerecord查询中使用多个.joins

时间:2014-01-11 16:57:42

标签: ruby-on-rails ruby ruby-on-rails-3

我正在创建json输出,我基本上得到了一堆任务,但我希望每个任务的json输出都包含用户名。

如何编写有效的activerecord查询来获取此信息?

这样的事情:Task.joins(:user).joins(:user_details)

数据库表:

Task
|id|user_id|

User
|id|

UserDetails
|id|user_id|first_name|last_name|

型号:

class Task < ActiveRecord::Base
    belongs_to :user
end

class User < ActiveRecord::Base
    has_one :user_details, :dependent => :destroy
    has_many :tasks
end

class UserDetails < ActiveRecord::Base
    belongs_to :user
end

修改

Task.joins(:user => :user_details)在结果集中不包含user_details.first_nameuser_details.last_name。这就是我最终的目标。

[#<Task id: 5, user_id: 1>, #<Task id: 10, user_id: 3>, #<Task id: 9, user_id: 9>]

1 个答案:

答案 0 :(得分:2)

容易腻:

Task.joins(user: :user_details)

根据您的编辑,Rails不会以这种方式工作。除非要编写自定义SQL,否则仍需要引用对象本身来获取其属性。

所以,你可以这样做:

Task.joins(user: :user_details)
# Or
Task.includes(user: :user_details)

然后,在您的视图中,您可以通过它在查询中抓取的父级来引用该属性。

user.user_details.first_name

但是,有一个更好的方法:代表

class User
  delegate :first_name, :whatever, to: :user_details
end
user.first_name => # Blah Blah

详细了解delegate