【问题标题】:Rails3 joins not including joined columnsRails3 连接不包括连接列
【发布时间】:2012-12-17 09:49:09
【问题描述】:

我有两个相关的ActiveObject 模型:

class Product < ActiveRecord::Base
 belongs_to :product_type

 #contains a field called name
end

class ProductType < ActiveRecord::Base
  has_many :products

  # contains a field called name
end

如果我使用他们的关系加入两个模型,一切都会很好:

Product.joins(:product_type)

"SELECT \"products\".* FROM \"products\" INNER JOIN \"product_types\" ON \"product_types\".\"id\" = \"products\".\"product_type_id\""

但是现在我需要获取具有特定ProductType 的产品,而我所知道的是产品类型是它的名称(每个产品类型的名称都是唯一的),所以我尝试在连接表中使用条件,正如 Rails 指南建议的那样:

Product.joins(:product_type).where(:product_type => {:name => "MyProductTypeUniqueName"})

产生以下 SQL:

"SELECT \"products\".* FROM \"products\" INNER JOIN \"product_types\" ON \"product_types\".\"id\" = \"products\".\"product_type_id\" WHERE \"product_type\".\"name\" = 'MyProductTypeUniqueName'" 

不幸的是,它失败并出现以下错误:

ActiveRecord::StatementInvalid: PG::Error: ERROR: missing FROM-clause entry for table "product_type"

错误似乎是因为在生成 SQL 时 product_type 列未包含在 FROM 子句中(至少 'product_type.name' 列不包含)

使用 PostgreSQL 和 Rails 3.2.3 SQL 结果是使用to_sql 方法为返回的ActiveRecord::Relation 对象实例提供的

我知道我可以直接提供 sql 字符串进行连接,但这应该可以工作,因为它是一个几乎等于 rails 指南中的示例。 我做错了什么?

编辑:两个模型都包含一个名为“名称”的字段。包括以防这是 ​​SQL 未正确构建的原因。

【问题讨论】:

    标签: ruby-on-rails-3 activerecord


    【解决方案1】:

    试试这个,

    Product.joins(:product_type).where(:table_name => {:name => "MyProductTypeUniqueName"})
    

    其中 :table_name 是数据库中 :product_type 的表名

    【讨论】:

    • 不起作用。 product_type 是一个belong_to 关联,因此必须是单数
    • @RickyAH 你的表名不是单数,而是复数,所以它必须是 :product_types
    • 带有表名的部分很有见地,我得到了它的工作。我认为在 where 子句中, :product_types 指的是 relation 而不是 table name (或者,更具体地说,我认为 ActiveRecord 会推断给定的正确表名关系)。不幸的是,“product_types”也不是表的名称(是为 rails 引擎创建的表,所以它实际上是“refinery_product_types”),这增加了更多的混乱。请编辑您的答案并指定 :product_types 必须是 TABLE 的名称,我很乐意接受它。谢谢@shweta
    猜你喜欢
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 2013-06-03
    • 2018-07-11
    • 2019-08-04
    • 2013-09-28
    相关资源
    最近更新 更多