来自活动记录联接的Postgres错误

时间:2013-08-28 17:45:43

标签: sql ruby-on-rails-3 postgresql activerecord refinerycms

Rails 3.2 Refinery 2.0.10

我的引擎之间存在基本关联

Work
  belongs_to client

Client
  has_many works

在我的控制器中,我有一个方法可以给我一个来自指定客户端(myClientName)的作品列表,但是我得到一个postgres错误,说我错过了一个from子句:

target = "myClientName"
::Refinery::Works::Work.joins(:client).where(client: {title: target})

错误:

PG::Error: ERROR:  missing FROM-clause entry for table "client"

我不认为我的问题是查询,因为它的构造几乎与活动记录文档中的示例相同:

time_range = (Time.now.midnight - 1.day)..Time.now.midnight
Client.joins(:orders).where(orders: {created_at: time_range})

我认为它可能是一个命名空间问题,但sql语句似乎正在查看正确的表。我绝不是一个sql大师但是我没有看到活动记录生成的sql有什么问题:

: SELECT "refinery_works".* FROM "refinery_works" INNER JOIN "refinery_clients" ON         "refinery_clients"."id" = "refinery_works"."client_id" WHERE "client"."title" = 'myClientName'

知道这里可能出现什么问题吗?

1 个答案:

答案 0 :(得分:1)

仔细查看您的查询:

SELECT "refinery_works".* 
FROM "refinery_works" 

此处的内部联接是指refinery_clients

INNER JOIN "refinery_clients" ON "refinery_clients"."id" = "refinery_works"."client_id"

在这里,您尝试使用client表属性

WHERE "client"."title" = 'myClientName'

基本上,查询是错误的 可能导致此问题发生的事情:

客户端模型是否引用了另一个表? self.table_name = 'refinery_clients'

尝试更改此部分.where(client: {title: target})
这样的事情,.where('refinery_clients.title = ?', target)
或者,如果您碰巧使用名为client的表格,.where('client.title = ?', target)