包含与加入

Mar*_*nto 2 activerecord ruby-on-rails

我有3个模型

  • 用户 - 有很多借方和很多贷方
  • 借方 - 属于用户
  • 信用 - 属于用户

借方和贷方非常相似。字段基本相同。我正在尝试对我的模型运行查询以返回用户为 current_user 的借方和贷方的所有字段

User.left_outer_joins(:debits, :credits).where("users.id = ?", @user.id)
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,从用户返回所有字段的次数与贷记和借记中的记录一样多。

User.includes(:credits, :debits).order(created_at: :asc).where("users.id = ?", @user.id)
Run Code Online (Sandbox Code Playgroud)

它运行了 3 个查询,我认为它应该在一个查询中完成。

这个问题的第二部分是。如何将记录类型添加到查询中?

因为在来自贷方的记录中会有一个额外的字段来显示贷方,借方也是如此

我已经研究了 ActiveRecordUnion gem,但我没有看到它将如何解决这里的问题

XML*_*yer 5

includes无法在一次查询中神奇地检索您想要的所有内容;它将为您需要点击的每个模型(通常)运行一个查询。相反,它消除了未来不必要的查询。以下列例子为例:

坏的

users = User.first(5)
users.each do |user|
  p user.debits.first
end
Run Code Online (Sandbox Code Playgroud)

这里总共有 6 个查询,一个是 User 检索所有用户,然后.debits是循环中的每个调用一个。

好的!

users = User.includes(:debits).first(5)
users.each do |user|
  p user.debits.first
end
Run Code Online (Sandbox Code Playgroud)

您将在此处只进行两项查询:一项针对用户,一项针对其关联的借方。这就是includes通过急切加载您知道需要的东西来加速您的应用程序的方式。

至于您的评论,是的,将它们组合成一张桌子似乎很有意义。根据您的情况,我建议您查看单表继承 (STI)。如果你不走这条路,小心添加一个名为 的列type,Rails 不会喜欢那样的!