在一个Rails ActiveRecord中获取两个查询

时间:2018-03-27 09:58:14

标签: ruby-on-rails activerecord

我一直在苦苦挣扎,自己无法找到正确的答案。

例如,我有两个独立的关联

Profile belongs_to User

Comment belongs_to User

ProfileComment都有 user_id 外键

通过Comment我可以轻松访问用户,例如Comment.first.user。但我不能像 Comment.first.user.profile 那样做(我怎么能这样做?) 我可以使用user_id在单个查询中加入结果吗?喜欢Comment.joins ..?我只是想知道这是否可行,如果我能得到一些参考资料,我可以做一个研究。

例如,我有User.find(1)

的查询
id:12 | email:firefox@email.com

我对User.find(1).profiles

有这个查询
name: Fire | lastname: Fox | id_user: 12

是否可以在ActiveRecord中获得这样的结果?

email:firefox@email.com | name: Fire | lastname: Fox

另外,我可以使用.all而不是.find或.where吗?

评论模型

class Comment < ApplicationRecord
  belongs_to :user
end

个人资料模型

class Profile < ApplicationRecord
  belongs_to :user
end

用户模型

class User < ApplicationRecord
  has_one :profile
  has_many :projects
  has_many :comments
  accepts_nested_attributes_for :profile
end

1 个答案:

答案 0 :(得分:2)

Sol 1 :如果您想在一个查询中获取

您需要加入ProfileUser,您可以像这样查询

Comment.joins(user: :profile)
  .select('users.email', 'profiles.name', 'profiles.lastname')
  .where(id: 123)

Sol 2 :您只需添加through关联

class Comment < ApplicationRecord
  belongs_to :user
  belongs_to :profile, through: :user
end

现在您可以像

一样访问它
comment = Comment.first
comment.user.email        #=> "firefox@email.com"
comment.profile.name      #=> "Fire"
comment.profile.lastname  #=> "Fox"

您也可以使用delegate,但这会触发2次查询

class User < ApplicationRecord
  has_one :profile
  has_many :projects
  has_many :comments
  accepts_nested_attributes_for :profile

  delegate :name, :lastname, to: :profile, allow_nil: true
end

现在,您可以直接在用户

上拨打namelastname
comment = Comment.first
comment.user.email        #=> "firefox@email.com"
comment.user.name         #=> "Fire"
comment.user.lastname     #=> "Fox"