我有两个相关的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 未正确构建的原因。