按 ID 过滤并使用 Rails AR 计数
Filtering by ID and count with Rails AR
我在用户和团队之间存在多对多关系,这在我的 rails 模型中反映为两个模型中的 has_many through
(而不是 HABTM)。
我想查找包含 ID 为 42
且没有其他用户的用户的所有团队。这在普通 SQL 中会很容易,但我不确定使用 Rails AR.
会是什么样子
我的模型是 User
、Team
和 Usersteam
。
这可能会解决您的问题。它混合了一些 SQL 片段,但我不知道这在纯 ActiveRecord 中是否可行。可能如果你混入 Arel,但那可能会变得更加混乱。
Team.
joins(:usersteams, :users).
where(usersteams: { user_id: 42}).
having("count(usersteams.user_id) = 1").
group("teams.id, usersteams.user_id").
all
除非您想编写复杂的原始 SQL,否则最好将其拆分为两个查询:
# assuming Team.table_name == 'teams'
user = User.find(42)
required_teams = user.teams.joins(:users).group('teams.id').having('COUNT(*) = 1')
我在用户和团队之间存在多对多关系,这在我的 rails 模型中反映为两个模型中的 has_many through
(而不是 HABTM)。
我想查找包含 ID 为 42
且没有其他用户的用户的所有团队。这在普通 SQL 中会很容易,但我不确定使用 Rails AR.
我的模型是 User
、Team
和 Usersteam
。
这可能会解决您的问题。它混合了一些 SQL 片段,但我不知道这在纯 ActiveRecord 中是否可行。可能如果你混入 Arel,但那可能会变得更加混乱。
Team.
joins(:usersteams, :users).
where(usersteams: { user_id: 42}).
having("count(usersteams.user_id) = 1").
group("teams.id, usersteams.user_id").
all
除非您想编写复杂的原始 SQL,否则最好将其拆分为两个查询:
# assuming Team.table_name == 'teams'
user = User.find(42)
required_teams = user.teams.joins(:users).group('teams.id').having('COUNT(*) = 1')