【问题标题】:Inner joins with Rails active record内部连接与 Rails 活动记录
【发布时间】:2012-12-19 20:27:16
【问题描述】:

我是 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 解决此问题的帮助或文档。

【问题讨论】:

标签: sql ruby-on-rails activerecord join


【解决方案1】:

您可以在所谓的rails console 中进行类似的实验。

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

rails c

等待提示!首先你需要获得一个用户:

u = User.first

然后你可以很容易地获得用户组:

g = u.usergroups

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

User.first.usergoups

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

binding.pry

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

【讨论】:

  • 您好,谢谢。控制台确实非常有价值,到目前为止我已经在其中花费了几个小时:) 我已经尝试过诸如“x= User.first.usergroups”之类的东西,这很好。但是当我到达 User.first.usergroups.includes 或加入时,它开始有点崩溃
  • 好的,问题是我不明白你想要做什么,请试着把它写得更清楚!您要查找的输出是什么?
  • 所以稍微分解一下 - 我想要Usergroup.find(groupID).users 的输出(有效),但在记录集末尾标记了额外的 usergroup_memberships.id 字段。我想我可以映射属性,但这似乎是错误的做法?
  • 好吧,你可以使用:m = Usergroup.find(groupID).usergroup_memberships 然后,你也可以访问m.id 和m.user。你想对结果做什么? Mb 如果你告诉我我可以靠近。
【解决方案2】:

我找到了适合我的东西:

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

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

@blah[i].user.email

(感谢您的 cmets - @Baldrick - 我认为我的模型可能有点破损/非常规,下一个项目要记住)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多