【问题标题】:has_many through doesn't work when using same table使用同一张表时,has_many through 不起作用
【发布时间】:2021-01-03 16:39:20
【问题描述】:

我有一个模特FamilyService。在模型中,我有这些关联:

belongs_to :family
has_many :balance_histories, :through => :family
has_many :balances, :through => :family

执行此命令:FamilyService.where("families.id > 90000").joins(:balances) 工作正常。我明白了:

SELECT families_services.*
FROM families_services
INNER JOIN families ON families.id = families_services.family_id
INNER JOIN balances ON balances.family_id = families.id
WHERE (families.id > 90000)

另外,执行这个查询:FamilyService.where("families.id > 90000").joins(:balance_histories) 给了我这个:

SELECT families_services.*
FROM families_services
INNER JOIN families ON families.id = families_services.family_id
INNER JOIN balance_histories ON balance_histories.family_id = families.id
WHERE (families.id > 90000)

太棒了!

但是当尝试这样做时:FamilyService.where("families.id > 90000").joins(:balances, :balance_histories)。我明白了:

SELECT families_services.*
FROM families_services
INNER JOIN families ON families.id = families_services.family_id
INNER JOIN balances ON balances.family_id = families.id
INNER JOIN families families_families_services_join ON families_families_services_join.id = families_services.family_id
INNER JOIN balance_histories ON balance_histories.family_id = families_families_services_join.id
WHERE (families.id > 90000)

这是错误的(家庭family_families_services_join ONfamily_families_services_join.id)。 如何解决?

【问题讨论】:

  • 真的错了吗?请把所有 3 个模型的描述都包括在内吗?

标签: mysql ruby-on-rails


【解决方案1】:

生成的查询实际上是正确的。线

INNER JOIN families families_families_services_join ON ...

只是暂时将名称 families_families_services_join 分配给表 families,以便查询更清晰。

但是,您可以通过将 joins 查询指定为来简化查询,

FamilyService.where("families.id > 90000").joins(family: [:balances, :balance_histories])

这会产生类似的东西

SELECT families_services.*
FROM families_services
INNER JOIN families ON families.id = families_services.family_id
INNER JOIN balances ON balances.family_id = families.id
INNER JOIN balance_histories ON balance_histories.family_id = families.id
WHERE (families.id > 90000)

【讨论】:

  • 很好的答案。谢谢。你能解释一下语法吗?为什么会给出不同的结果?
猜你喜欢
  • 2016-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 2014-05-03
  • 1970-01-01
  • 2011-06-07
相关资源
最近更新 更多