首页 > 解决方案 > Rails 嵌套连接与第三个模型

问题描述

我有 3 个模型。

用户.rb

has_many :user_cards

用户卡.rb

belongs_to :CardGroup

我想在一个查询中获取所有用户,以及卡片和 CardGroup 信息。

 User.joins("LEFT OUTER JOIN user_cards ON user_cards.user_id = users.id AND user_cards.created_at BETWEEN '#{@start_time.to_s(:db)}' AND '#{@end_time.to_s(:db)}'")
 .group('users.id, users.mobile, user_cards.user_id, user_cards.bin)
         .select(
      'users.id AS uid, users.name AS uname, users.mobile AS umobile,' \
      'count(distinct(user_cards.id)) AS total_cards, \
      'user_cards.bin AS card_bins'
    )

现在,我也想加入第三个模型 CardGroup 并在上面的查询中获取 user_card.card_group.name 。

如何使用嵌套连接/任何其他方式来做到这一点?

标签: ruby-on-railspostgresqljoin

解决方案


首先,您应该在 ruby​​ 中使用蛇形盒。

belongs_to :card_group

其次,你的这部分join陈述最好放在一个where子句中。

AND user_cards.created_at BETWEEN '#{@start_time.to_s(:db)}' AND '#{@end_time.to_s(:db)}'"

第三,连接查询本身在 Ruby 中更具可读性。这就是为什么您首先将关系放在模型上。所以替换:

LEFT OUTER JOIN user_cards ON user_cards.user_id = users.id 

User.left_outer_joins(:user_cards)

现在添加通过第 2 个连接的第 3 个模型非常简单:

User.left_outer_joins(user_cards: :card_group)

推荐阅读