tutorial relaciones rails español ruby-on-rails exception activerecord ruby-on-rails-4 jointable

ruby-on-rails - español - relaciones en ruby on rails



¿Por qué obtengo una excepción clave primaria desconocida para una tabla de unión en Rails 4? (4)

En modelo agregar

self.primary_key = [:order_id, :product_id]

y creo que sería conveniente asegurarse de que haya un índice en esas columnas. Puede crear uno con la siguiente migración

add_index :line_items, [:order_id, :product_id]

Estos son mis modelos:

class Product has_many :line_items has_many :orders, :through => :line_items end class LineItem belongs_to :order belongs_to :product end class Order has_many :line_items has_many :products, :through => :line_items end

Desde schema.rb:

create_table "line_items", id: false, force: true do |t| t.integer "order_id" t.integer "product_id" t.integer "quantity" t.datetime "created_at" t.datetime "updated_at" end

Acabo de actualizar a Rails 4, y mi mesa de unión dejó de funcionar. Si hago @order.line_items , arroja la excepción "Clave primaria desconocida para la tabla line_items en el modelo LineItem". @order.products funciona como se esperaba.

He intentado descartar y volver a crear la tabla line_items, y he intentado instalar la gema protected_attributes, pero nada ha cambiado.

Aquí está el rastro .


La respuesta aceptada eliminó el mensaje de error, pero aún no pude guardar @ order.line_items sin obtener un error que me dice que [: order_id,: product_id] no existe.

Finalmente resolví esto eliminando la tabla line_items y recreándola con esta migración:

def change create_table :line_items do |t| t.references :order t.references :product t.integer :quantity t.timestamps end end

No había usado "referencias" cuando creé la tabla originalmente, a Rails 3 no le importó, pero hizo que Rails 4 se quejara.


La id: false en su esquema original indica que no hay un campo de id en la tabla. Rails 4 agregó un método de ayuda create_join_table que crea tablas sin campo de id Y lo usa para cualquier migración con JoinTable en el nombre.

La única forma en que puedo imaginar que JoinTable resultados diferentes con Rails 4 que con Rails 3 es si has regenerado tus migraciones y JoinTable con JoinTable en el nombre. ¿Aún tienes tu esquema de Rails 3? Sería interesante observar que tiene id: false para la tabla de unión.

En cuanto a primary_key, la razón por la que podría establecerse la clave primaria en una matriz pero posteriormente no funcionó es porque el método primary_key= convierte ciegamente su argumento en una cadena por línea 115 de https://github.com/rails/ rails / blob / a0dfd84440f28d2862b7eb7ea340ca28d98fb23f / activerecord / lib / active_record / attribute_methods / primary_key.rb # L115

Ver también https://.com/a/20016034/1008891 y sus enlaces.


Tuve este error, pero soltando mi base de datos local con rake db:drop y luego creando con rake db:create antes de ejecutar pg_restore con heroku db dump lo resolvió.