Rails的PG :: UndefinedTable:错误:缺少子句条目表 [英] Rails PG::UndefinedTable: ERROR: missing FROM-clause entry for table

查看:259
本文介绍了Rails的PG :: UndefinedTable:错误:缺少子句条目表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的模型

 类发售<的ActiveRecord :: Base的
  belongs_to的:代理
结束

类机构<的ActiveRecord :: Base的
  的has_many:报价
结束
 

当我做了这样的要求 - 一切都OK了。

  @offers = Offer.with_state(:确认)。
  包括(:目的地:cruise_line,:船)。
  分页(per_page:10,页:PARAMS [:页面])。装饰
 

但我只想选择属于主动机构(列状态机构表),所以我试着这样做:

  @offers = Offer.with_state(:确认)。
  包括(:目的地:cruise_line,:船)。
  加入(:机构)。
  其中,(社:{状态:激活})。
  分页(per_page:10,页:PARAMS [:页面])。装饰
 

这样做之后,我得到错误 PG :: UndefinedTable:错误:缺少子句条目表代理。什么是错我的code?

查询给了我这个错误和SQL:

  PG :: UndefinedTable:错误:缺少子句条目表代理LINE 1。...... IDWHERE(优惠国家IN('确认'))和代理...... ^:
选择报价,IDAS t0_r0,计划书,名AS t0_r1,计划书。目标IDAS t0_r2,计划书。cruise_line_idAS t0_r3,计划书。ship_idAS t0_r4 计划书。departure_dateAS t0_r5,计划书。departure_port_idAS t0_r6,计划书。arrival_dateAS t0_r7,计划书。arrival_port_idAS t0_r8,计划书。flight_priceAS t0_r9 计划书,奖金AS t0_r10,计划书。行程AS t0_r11,计划书。board_language_idAS t0_r12,计划书。agency_landing_pageAS t0_r13,计划书。福利AS t0_r14 计划书。inner_priceAS t0_r15,计划书。inner_price_normalAS t0_r16,计划书。outer_priceAS t0_r17,计划书。outer_price_normalAS t0_r18,计划书。balcony_priceAS t0_r19 计划书。balcony_price_normalAS t0_r20,计划书。suite_priceAS t0_r21,计划书。suite_price_normalAS t0_r22,计划书。lucky_priceAS t0_r23,计划书。lucky_price_normalAS t0_r24 计划书。VALID_FROMAS t0_r25,计划书。valid_tillAS t0_r26,计划书。created_atAS t0_r27,计划书。的updated_atAS t0_r28,计划书。说明AS t0_r29 计划书。agency_idAS t0_r30,计划书。状态AS t0_r31,目标,IDAS t1_r0,目标,名AS t1_r1,目的地。created_atAS t1_r2 ,目的地。的updated_atAS t1_r3,cruise_lines。IDAS t2_r0,cruise_lines,名AS t2_r1,cruise_lines。created_atAS t2_r2,cruise_lines。的updated_atAS t2_r3 船,IDAS t3_r0,船,名AS t3_r1,船,图片AS t3_r2,船,cruise_line_idAS t3_r3,船,created_atAS t3_r4 船。的updated_atAS t3_r5
从计划书
INNER JOIN机构ON机构,ID=报价。agency_id
LEFT OUTER JOIN目的地ON目的地,ID=报价。目标ID
LEFT OUTER JOINcruise_linesONcruise_lines。ID=报价。cruise_line_id
LEFT OUTER JOIN船ON船,ID=报价。ship_id
WHERE(报价,状态IN('确认'))和代理,状态=主动
LIMIT 10 OFFSET 0
 

解决方案

您已经添加的唯一事情是一个其中, -clause。好像这是有问题的:

 其中(机构:{状态:激活})
 

...和产生错误的情况,因为在这种情况下,散列键有望意味着一个表名。你或许应该有这样的:

 其中(机构:{状态:激活})
 

更新

见此情景吸引了相当多的关注,我想我也应该建议做同样的,稍微可组合不同的方式:

 合并(Agency.where(状态:激活))
 

这怎么是好?它可以让你使用范围

 #内设机构
适用范围:积极, - > {其中,(状态:激活)}

# 别的地方
合并(Agency.active)
 

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:

@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?

The query gives me this error and 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

解决方案

The only thing you've added is a where-clause. Seems like it's problematic:

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 allows you to use scopes:

# Inside Agency
scope :active, -> { where(state: 'active') }

# Somewhere else
merge(Agency.active)

这篇关于Rails的PG :: UndefinedTable:错误:缺少子句条目表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆