0

我有两个相关的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\""

但是现在我需要获取具有特定 的 Products 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 时 FROM 子句中不包含 product_type 列(至少“product_type.name”列不包含)

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

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

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

4

1 回答 1

0

尝试这个,

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

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

于 2012-12-17T11:08:15.413 回答