如何在rails活动模型上构建select cmd?

时间:2015-06-23 09:39:13

标签: ruby-on-rails-4 rails-models

用户表

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或最佳方式以获得我在铁轨活动模型上的预期结果?

2 个答案:

答案 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。

(代码在编写时未经测试。)