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ó.