我一直在苦苦挣扎,自己无法找到正确的答案。
例如,我有两个独立的关联
Profile
belongs_to User
Comment
belongs_to User
Profile
和Comment
都有 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
答案 0 :(得分:2)
Sol 1 :如果您想在一个查询中获取
您需要加入Profile
至User
,您可以像这样查询
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
现在,您可以直接在用户
上拨打name
和lastname
comment = Comment.first
comment.user.email #=> "firefox@email.com"
comment.user.name #=> "Fire"
comment.user.lastname #=> "Fox"