postgresql Rails PG::UndefinedTable:错误:缺少表的 FROM 子句条目
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/27106853/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Rails PG::UndefinedTable: ERROR: missing FROM-clause entry for table
提问by kovpack
I have models
我有模特
class Offer < ActiveRecord::Base
belongs_to :agency
end
class Agency < ActiveRecord::Base
has_many :offers
end
When I do such request - everything is OK
当我提出这样的要求时 - 一切都很好
@offers = Offer.with_state(:confirmed).
includes(:destination, :cruise_line, :ship).
paginate(per_page: 10, page: params[:page]).decorate
But I want to select only offers that belong to active
agencies (column state
from agencies
table), so I try to do like this:
但我想只选择属于报价active
机构(列state
从agencies
,所以我尝试做这样的表),:
@offers = Offer.with_state(:confirmed).
includes(:destination, :cruise_line, :ship).
joins(:agency).
where(agency: {state: 'active'}).
paginate(per_page: 10, page: params[:page]).decorate
Having done this I get error PG::UndefinedTable: ERROR: missing FROM-clause entry for table "agency"
. What is wrong with my code?
完成此操作后,我收到错误消息PG::UndefinedTable: ERROR: missing FROM-clause entry for table "agency"
。我的代码有什么问题?
The query gives me this error and sql:
查询给了我这个错误和 sql:
PG::UndefinedTable: ERROR: missing FROM-clause entry for table "agency" LINE 1: ...id" WHERE ("offers"."state" IN ('confirmed')) AND "agency"."... ^ :
SELECT "offers"."id" AS t0_r0, "offers"."name" AS t0_r1, "offers"."destination_id" AS t0_r2, "offers"."cruise_line_id" AS t0_r3, "offers"."ship_id" AS t0_r4, "offers"."departure_date" AS t0_r5, "offers"."departure_port_id" AS t0_r6, "offers"."arrival_date" AS t0_r7, "offers"."arrival_port_id" AS t0_r8, "offers"."flight_price" AS t0_r9, "offers"."bonus" AS t0_r10, "offers"."itinerary" AS t0_r11, "offers"."board_language_id" AS t0_r12, "offers"."agency_landing_page" AS t0_r13, "offers"."benefits" AS t0_r14, "offers"."inner_price" AS t0_r15, "offers"."inner_price_normal" AS t0_r16, "offers"."outer_price" AS t0_r17, "offers"."outer_price_normal" AS t0_r18, "offers"."balcony_price" AS t0_r19, "offers"."balcony_price_normal" AS t0_r20, "offers"."suite_price" AS t0_r21, "offers"."suite_price_normal" AS t0_r22, "offers"."lucky_price" AS t0_r23, "offers"."lucky_price_normal" AS t0_r24, "offers"."valid_from" AS t0_r25, "offers"."valid_till" AS t0_r26, "offers"."created_at" AS t0_r27, "offers"."updated_at" AS t0_r28, "offers"."description" AS t0_r29, "offers"."agency_id" AS t0_r30, "offers"."state" AS t0_r31, "destinations"."id" AS t1_r0, "destinations"."name" AS t1_r1, "destinations"."created_at" AS t1_r2, "destinations"."updated_at" AS t1_r3, "cruise_lines"."id" AS t2_r0, "cruise_lines"."name" AS t2_r1, "cruise_lines"."created_at" AS t2_r2, "cruise_lines"."updated_at" AS t2_r3, "ships"."id" AS t3_r0, "ships"."name" AS t3_r1, "ships"."picture" AS t3_r2, "ships"."cruise_line_id" AS t3_r3, "ships"."created_at" AS t3_r4, "ships"."updated_at" AS t3_r5
FROM "offers"
INNER JOIN "agencies" ON "agencies"."id" = "offers"."agency_id"
LEFT OUTER JOIN "destinations" ON "destinations"."id" = "offers"."destination_id"
LEFT OUTER JOIN "cruise_lines" ON "cruise_lines"."id" = "offers"."cruise_line_id"
LEFT OUTER JOIN "ships" ON "ships"."id" = "offers"."ship_id"
WHERE ("offers"."state" IN ('confirmed')) AND "agency"."state" = 'active'
LIMIT 10 OFFSET 0
回答by D-side
The only thing you've added is a where
-clause. Seems like it's problematic:
您添加的唯一内容是 -where
子句。好像有问题:
where(agency: {state: 'active'})
...and produces a wrong condition because hash key in this case is expected to mean a table name. You should probably have this:
...并产生错误的条件,因为在这种情况下,散列键应表示表名。你应该有这个:
where(agencies: {state: 'active'})
Update
更新
Seeing this attract quite a lot of attention, I think I should also suggest a different way of doing the same, slightly more composable:
看到这个吸引了很多关注,我想我也应该建议一种不同的方式来做同样的事情,稍微更可组合:
merge( Agency.where(state: 'active') )
How is this one better? It makes no assumptions about the table name of the model (not that it matters most of the time) and allows you to use scopes:
这个如何更好?它不对模型的表名做任何假设(大多数情况下这并不重要)并允许您使用scopes:
# Inside Agency
scope :active, -> { where(state: 'active') }
# Somewhere else
merge(Agency.active)