我有3个模型
- 用户 - 有很多借方和很多贷方
- 借方 - 属于用户
- 信用 - 属于用户
借方和贷方非常相似。字段基本相同。 我正在尝试对我的模型运行查询以返回用户为 current_user 的借方和贷方中的所有字段
User.left_outer_joins(:debits, :credits).where("users.id = ?", @user.id)
正如预期的那样,从用户返回所有字段的次数与贷方和借方中的记录一样多。
User.includes(:credits, :debits).order(created_at: :asc).where("users.id = ?", @user.id)
它运行了 3 个查询,我认为它应该一次完成。
这个问题的第二部分是。如何将记录类型添加到查询中?
因为在贷方记录中会有一个额外的字段来显示贷方,借方也是如此
我已经研究过 ActiveRecordUnion gem,但我没有看到它如何解决这里的问题
最佳答案
includes
无法在一次查询中神奇地检索您想要的所有内容;它将针对您需要点击的每个模型(通常)运行一个查询。相反,它消除了 future 不必要的查询。举以下例子:
不好
users = User.first(5)
users.each do |user|
p user.debits.first
end
这里总共有 6 个查询,一个用于 User 检索所有用户,然后一个用于循环中的每个 .debits
调用。
好!
users = User.includes(:debits).first(5)
users.each do |user|
p user.debits.first
end
您在这里只会进行两个查询:一个针对用户,一个针对他们的相关借记。这就是 includes
通过预先加载您知道自己需要的东西来加速您的应用程序的方式。
至于您的评论,是的,将它们合并到一个表中似乎很有意义。根据您的情况,我建议您查看单表继承 (STI)。如果您不走这条路,请小心添加一个名为 type
的列,Rails 不会喜欢那样!
关于ruby-on-rails - 包含与加入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42917875/