用户表
id| name | email | invited_by_id
1 | jhon | jhon@mail.com | null
2 | sarah | sarah@mail.com | 1
3 | baby | baby@mail.com | 2
作为用户表,你会看到sarah被jhon邀请,而且被sarah邀请了。
期待结果
id| name | email | invited_by_id | invited_by_name
1 | jhon | jhon@mail.com | null | null
2 | sarah | sarah@mail.com| 1 | jhon
3 | baby | baby@mail.com | 2 | sarah
如何创建选择cmd或最佳方式以获得我在铁轨活动模型上的预期结果?
答案 0 :(得分:0)
user.rb
def inviter_name
if self.invited_by_id.nil?
nil
else
User.find(self.invited_by_id).name
end
end
或者您可以使用belongs_to
belongs_to :inviter, class_name: "User", foreign_key: 'invited_by_id'
,邀请者名称可以如下所示:
@user.inviter.name
答案 1 :(得分:0)
@Zoker是正确的,您应该在模型定义中添加'belongs_to'子句:
belongs_to :invited_by, class_name: "User"
完成后,请求可以像这样简单:
User.all.each do |user|
puts [user.name, user.email, user.invited_by_id.to_s, user.invited_by.name].join(", ")
end
这将打印出您需要的结果的(非常)基本CSV列表。这在控制台会话中最有意义 - 如果您将此代码放在控制器中,您最终会在服务器输出中丢失它。
对于大型列表,您将使用此查找获得性能提升。对于每一行,将向数据库发出单独的请求以查找“邀请者”用户,以便我们读取该名称。
最好是这样做:
User.includes(:invited_by).each do |user|
puts [user.name, user.email, user.invited_by_id.to_s, user.invited_by.name].join(", ")
end
这告诉Rails再一次查询,一次性获取所有包含的“invite_by”用户。这意味着您现在只需要生成(number_of_rows + 1)个查询而不是2。
(代码在编写时未经测试。)