【发布时间】:2021-05-28 17:37:10
【问题描述】:
我想让用户使用他们的资产,类型为“Google”。
我试过了
User.joins(:assets).where(assets: { assetable_type: 'Google' })
或
User.joins(:assets).where("assets.assetable_type = 'Google'")
但作用域的工作方式相同,并且什么也不返回。
SQL,作用域生成:
SELECT "users".* FROM "users" INNER JOIN "assets" ON "assets"."assetable_id" = "users"."id" AND "assets"."assetable_type" = 'User' WHERE (assets.assetable_type = 'Google')
看起来不太对
我做错了什么?
【问题讨论】:
-
据我所知,您在 Rails 中定义了多态关联。你能提供看起来正确的关系声明和 SQL 吗?
-
User.joins('assets.assetable_id = users.id AND assets.assetable_type = "Google"')
-
where用于过滤连接记录的行集。joins旨在通过某些属性将少数表中的记录连接起来,您不能在where语句中指定它们,应该在INNER JOIN [TABLE] ON [ATTRIBUTES]中完成。 -
默认情况下,在 Rails 中
User.joins(:assets)表示SELECT "users".* FROM "users" INNER JOIN "assets" ON "assets"."assetable_id" = "users"."id" AND "assets"."assetable_type" = 'User'并且您无法在此处设置任何参数来更改连接条件。但你可以编写自定义加入:User.joins('assets.assetable_id = users.id AND assets.assetable_type = "Google"') -
当您在资产模型中定义了多态关联并且您对具有特定外部 id 但不是预期的外部类型的关联记录运行查询时,您的查询不再有意义,因为您将加载仅偶然共享相同 id 但未真正通过定义的关联连接的记录(因为类型不匹配)。请说明您如何在模型中定义关联。
标签: sql ruby-on-rails ruby activerecord