【问题标题】:Rails: join query on association with class_nameRails:加入查询与class_name的关联
【发布时间】:2016-03-11 07:11:02
【问题描述】:
class A < ActiveRecord::Base
  has_one :b, class_name: "Something::B"
end

module Something
  class B < ActiveRecord::Base
  end
end

假设上述类结构具有实际表名asomething_b,我想创建以下 SQL 查询。

SELECT  "a".* FROM "a" 
INNER JOIN "something_b" ON
"something_b"."a_id" = "a"."id" 
WHERE "something_b"."some_column" = "some_value" LIMIT 1

我尝试了一些类似的东西

A.joins(:b).find_by(b: { some_column: 'some_value' })

但结果查询如下,在WHERE 子句中有"b" 而不是"something_b"

SELECT  "a".* FROM "a" 
INNER JOIN "something_b" ON
"something_b"."a_id" = "a"."id" 
WHERE "b"."some_column" = "some_value" LIMIT 1

有没有办法在不显式指定表名的情况下做到这一点?

A.joins(:b).find_by(something_b: { some_column: 'some_value' })

【问题讨论】:

  • 你的数据库表是否命名为 something_b?

标签: sql ruby-on-rails ruby-on-rails-4 activerecord


【解决方案1】:

如果您的模型名称和表名称不符合 rails 约定(最简单的形式为 table_name = SomeClass.name.pluralize.downcase),那么您需要在模型中定义实际的表名称。

module Something
  class B < ActiveRecord::Base
    self.table_name = 'something_b'
  end
end

以上更改应该在生成的查询中选择正确的表名。

【讨论】:

  • 恐怕它不起作用:在控制台中尝试会出现以下错误。 (数据库适配器是 postgresql)ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: missing FROM-clause entry for table "b" 生成的查询是:SELECT "a".* FROM "a" INNER JOIN "something_b" ON "something_b"."a_id" = "a"."id" WHERE "b"."some_column" = 'some_value' LIMIT 1
  • 请发布您执行的查询。
【解决方案2】:

您可以尝试以下解决方案之一。

  1. 在模块中可以定义如下方法

    def self.table_name_prefix
       'something_'
    end
    

  1. 在课堂上你可以设置表名

    self.table_name = 'something_b'
    

【讨论】:

    猜你喜欢
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    相关资源
    最近更新 更多