Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

ActiveRecordRelations cannot generate an RBI for an Active Record model with a composite primary key

Abierto
#2,723 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 3 días

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
3/5
Tiempo estimado
1-2 días
Aptitud para principiantes
76/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
postgresql, rails, ruby

Línea de trabajo

Start in lib/tapioca/dsl/compilers/active_record_relations.rb around line 801 and inspect ActiveRecordColumnTypeHelper#type_for in lib/tapioca/dsl/compilers/helpers/active_record_column_type_helper.rb around line 60. Run the supplied repro.rb with Rails 8 and PostgreSQL available, then verify generation succeeds for the composite key and produces typed tuple ids while preserving scalar primary-key behavior.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Problem

ActiveRecordRelations cannot generate an RBI for an Active Record model with a composite primary key. When generating ids, it passes
constant.primary_key—an Array—to ActiveRecordColumnTypeHelper#type_for, whose argument is typed as String.

Reproduced with Tapioca 0.19.2 and Rails 8. The same call is present in v0.20.0 and current main, though I have only run this reproduction against
0.19.2.

Minimal reproduction

With tapioca 0.19.2, Active Record 8, and the PostgreSQL adapter available, run bundle exec ruby repro.rb:

require "active_record"
require "active_record/connection_adapters/postgresql/oid/uuid"
require "tapioca/internal"
require "tapioca/dsl/compilers/active_record_relations"

class CompositeRecord < ActiveRecord::Base
  self.primary_key = %w[listing_id checkin_on checkout_on]

  def self.table_exists? = true

  def self.columns_hash
    %w[listing_id checkin_on checkout_on].to_h do |name|
      [name, Struct.new(:null).new(false)]
    end
  end

  def self.attribute_types
    {
      "listing_id" => ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Uuid.new,
      "checkin_on" => ActiveRecord::Type::Date.new,
      "checkout_on" => ActiveRecord::Type::Date.new,
    }
  end
end

compiler = Tapioca::Dsl::Compilers::ActiveRecordRelations
pipeline = Tapioca::Dsl::Pipeline.new(
  requested_constants: [CompositeRecord],
  requested_compilers: [compiler],
)
root = RBI::Tree.new
compiler.new(pipeline, root, CompositeRecord).decorate

The metadata is supplied in memory to keep the reproduction database-free; it exercises the actual compiler.

Actual result

  TypeError: Parameter 'attribute_name': Expected type ::String,
  got type Array with value ["listing_id", "checkin_on", "checkout_on"]
  Caller: .../active_record_relations.rb:801
  Definition: .../active_record_column_type_helper.rb:60

Expected result

Generation succeeds, with ids returning typed tuples for these columns—for example, T::Array[[::String, ::Date, ::Date]].

ActiveRecordColumnTypeHelper#type_for("id") already delegates to its composite-aware id_type method. Could the Relations compiler use that path for ids,
while preserving scalar/nonstandard primary-key behavior?

Related earlier work: #1966 addresses composite find overloads; #2007 addresses composite column types.

Lenguaje dominante
Ruby
Estrellas
873
Forks
164
Merge medio
4 d 19 h
PR fusionados (30 d)
8

Preparar el entorno

Aún no hemos revisado los archivos de configuración de este proyecto. Empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de Shopify/tapioca

Todos los issues de Shopify/tapioca

Issues similares

Más issues de Ruby

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.