rails includes guide generate active sql ruby-on-rails postgresql activerecord orm

sql - includes - Rails PG:: UndefinedTable: ERROR: falta la entrada de la cláusula FROM para la tabla



ruby rails guide (1)

Tengo modelos

class Offer < ActiveRecord::Base belongs_to :agency end class Agency < ActiveRecord::Base has_many :offers end

Cuando hago tal solicitud - todo está bien

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

Pero quiero seleccionar solo las ofertas que pertenecen a agencias active ( state columna de la tabla de agencies ), así que trato de hacer esto:

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

Una vez hecho esto, obtengo el error PG::UndefinedTable: ERROR: missing FROM-clause entry for table "agency" . ¿Qué está mal con mi código?

La consulta me da este error y 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


Lo único que has agregado es un where -clausa. Parece que es problemático:

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

... y produce una condición incorrecta porque se espera que la clave hash en este caso signifique un nombre de tabla. Probablemente deberías tener esto:

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

Actualizar

Al ver que esto atrae mucha atención, creo que también debería sugerir una forma diferente de hacer lo mismo, un poco más compostable:

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

¿Cómo es este mejor? No hace suposiciones sobre el nombre de la tabla del modelo (no es que importe la mayor parte del tiempo) y le permite usar ámbitos :

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