【问题标题】:How to use joins with `where` condition如何在 `where` 条件下使用连接
【发布时间】: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


【解决方案1】:

您没有提供有关您的模型和关联的任何详细信息

所以,我可以给你一个使用原始 sql 的临时解决方案

  sql = "SELECT users.* FROM users INNER JOIN assets ON assets.assetable_id = users.id WHERE assets.assetable_type = 'Google'"
  result = ActiveRecord::Base.connection.execute(sql).to_a

注意:如果您按照 Rails 标准使用关系,则应该是

  sql = "SELECT users.* FROM users INNER JOIN assets ON assets.assetable_id = users.id WHERE assets.assetable_type = 'Google'"
  result = ActiveRecord::Base.connection.execute(sql).to_a

但我认为您使用的是另一个名称,即assetable_id 而不是 user_id。

【讨论】:

    猜你喜欢
    • 2015-10-26
    • 2023-03-16
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 2018-11-20
    • 2018-04-18
    • 1970-01-01
    • 2012-07-18
    相关资源
    最近更新 更多