内部联接与Rails活动记录

时间:2012-12-19 20:27:16

标签: sql ruby-on-rails activerecord join

我是Rails的新手,并且一直在学习各种书籍和教程。我有一个简单的(ish)设置,下面是模型和模式。 我正在尝试获取用户详细信息以及usergroup_membership ID。我想我的模型设置正确,我想要实现的目标(关系就像它们出现的那样,用户通过usergroup_memberships属于组 - 没什么特别的)。 使用'rails db'我可以使用原始SQL来获取我需要的记录集,但我无法弄清楚如何使用Rails方式。

我的基本课程

Class User
has_many :usergroup_memberships
has_many :usergroups, :through => :usergroup_memberships

Class Usergroup
has_many :usergroup_memberships, :dependent => :destroy
has_many :users, :through => :usergroup_memberships

Class UsergroupMembership
belongs_to :usergroup
belongs_to :user

运行的SQL

SELECT users.*, usergroup_memberships.id 
FROM users
LEFT JOIN usergroup_memberships ON usergroup_memberships.user_id = users.id 
WHERE usergroup_memberships.usergroup_id = 1;

上面的SQL很好,并返回记录集,最后标记为已加入的usergroup_memberships.id。任何有关如何通过Rails处理此问题的帮助或文档都非常感谢。

2 个答案:

答案 0 :(得分:1)

你可以在所谓的rails console中进行这样的实验。

如果您在apps目录中,可以使用以下命令启动rails控制台:

rails c

等待提示!首先,您需要获得一位用户:

u = User.first

然后,您可以轻松获得用户组:

g = u.usergroups

你会发现自己总是在控制台中测试这些东西,你可以在你的应用程序中使用它,例如:获得第一个用户用户组:

User.first.usergoups

但是,让我推荐一下gem:pry。通过使用这个gem(只需将它放入Gemfile),您可以在应用程序内部创建断点以进行调试,这将导致rails控制台。例如,在控制器方法中,您可以说:

binding.pry

当执行此行时,rails服务器将切换到调试模式并在断点处暂停,您可以看到该范围内定义的所有变量,方法。

答案 1 :(得分:0)

我找到了适合我的东西:

@blah = Usergroup.find(groupID).usergroup_memberships.includes(:user)

然后,要访问用户详细信息:

@blah[i].user.email

(感谢您的评论 - @Baldrick - 我认为我的模型有点破碎/非传统,下一个项目需要注意的事项。)