¿Cómo establece automáticamente la clave externa en un nuevo objeto de una relación ActiveRecord si los nombres de clase no coinciden?

La siguiente clase es una subclase de Quote que usa herencia de tabla única.

class BuyQuote < Quote
  has_many :shipment_quotes, foreign_key: :quote_id
  has_many :shipments, through: :shipment_quotes
end

Me gustaría crear un envío usando el ActiveRecord estándar new método.

quote = BuyQuote.create
shipment = quote.shipments.new

Pero, la relación no se está estableciendo entre el shipment y el quote. Supongo que esto se debe a que el nombre de la clase es diferente al esperado, pero no estoy seguro.

¿Cómo puedo modificar la relación ActiveRecord para que esto funcione?

preguntado el 24 de agosto de 12 a las 20:08

1 Respuestas

Parece que tiene algunos errores de sintaxis en su código publicado y posiblemente un nombre de tabla incorrecto. Si la tabla de búsqueda no necesita ningún atributo adicional (aparte de relacionar el envío con la cotización), simplemente usaría la relación simplista has_and_belongs_to_many. Esto depende de si planea tener un envío asociado con más de una cotización.

class BuyQuote < Quote
  has_many :shipments_quotes, :foreign_key => :quote_id
  has_many :shipments, :through => :shipments_quotes
end

o con relación habtm:

class BuyQuote < Quote
  has_and_belongs_to_many :shipments, :foreign_key => :quote_id
end

Otro problema podría deberse a que está instanciando una clase de cotización, para la cual no muestra la definición. Parece que está definiendo la relación de "envíos" para la clase BuyQuote, pero no para la clase principal Quote.

Tal vez intente:

quote = BuyQuote.create
shipment = quote.shipments.new

Respondido 24 ago 12, 21:08

Derecha. debería haber escrito BuyQuote.new. Eso fue solo un error en la pregunta. Pero, no parece importar si defino la relación a shipments en la superclase o no. - apenas conocido

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.