我有模特

class Offer < ActiveRecord::Base
  belongs_to :agency
end

class Agency < ActiveRecord::Base
  has_many :offers
end

当我提出这样的要求时,一切都很好

@offers = Offer.with_state(:confirmed).
  includes(:destination, :cruise_line, :ship).
  paginate(per_page: 10, page: params[:page]).decorate

但我只想 Select 属于active家机构的报价(agencies表第state列),所以我try 这样做:

@offers = Offer.with_state(:confirmed).
  includes(:destination, :cruise_line, :ship).
  joins(:agency).
  where(agency: {state: 'active'}).
  paginate(per_page: 10, page: params[:page]).decorate

这样做之后,我得到了错误PG::UndefinedTable: ERROR: missing FROM-clause entry for table "agency".我的代码怎么了?

查询给出了以下错误和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

推荐答案

你只加了一个where条款.似乎有问题:

where(agency: {state: 'active'})

...并生成错误的条件,因为在本例中,哈希键应表示表名.你可能应该有这个:

where(agencies: {state: 'active'})

使现代化

鉴于这一点吸引了很多人的注意,我想我也应该提出一种不同的方法来做同样的事情,稍微更具可组合性:

merge( Agency.where(state: 'active') )

这个怎么样更好?它对模型的表名不做任何假设(大多数情况下并不重要),并允许您使用scopes:

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

# Somewhere else
merge(Agency.active)

Postgresql相关问答推荐

从子查询中的排序结果中获取前X行

为什么我的应用程序接收的是空值而不是布尔值?

Postgres 11没有强制执行外键约束?

Postgres 使用不同元素数据类型的订单数据

有没有办法共享数据或监控复杂 PostgresQL 事务的进度?

将 postgres 从属提升为主 node

PostgreSQL - 如何获得前一个月和一周的价值?

如何在 postgresql 中创建一个空的 JSON 对象?

在 Ubuntu 11.04 服务器中启用对 postgresql 的 PHP 支持

是否可以在 Postgres 中存储一个 1 字节的数字?

如何将1 天 01:30:00等间隔转换为25:30:00?

返回 NULL 的空数组的 array_length()

django.db.utils.IntegrityError:duplicate key value violates unique constraint "django_content_type_pkey"

从没有行的计数中获取 0 值

按任意时间间隔计算行数的最佳方法

FOR EACH STATEMENT 触发器示例

错误:关系列不存在 PostgreSQL,无法运行插入查询

升级到 Yosemite 10.10 后无法连接到 postgresql 数据库

错误:索引表达式中的函数必须在 Postgres 中标记为 IMMUTABLE

Postgresql 用随机值更新每一行