2010-05-29 18 views
67

así que tengo una create_table como esto para cursos en una escuela:Migración de carriles: t.referencias con nombre alternativo?

create_table :courses do |t| 
    t.string :name 
    t.references :course 
    t.timestamps 
end 

pero lo quiero hacer referencia a dos otros cursos como:

has_many :transferrable_as # A Course 
has_many :same_as   # Another Course 

¿Puedo decir lo siguiente?

t.references :transferrable_as, :as=> :course 

Respuesta

12

creo que este hilo tiene una forma más carriles-ish diferente: Scaffolding ActiveRecord: two columns of the same data type

en la migración:

t.belongs_to: transferrable_as

t.belongs_to: same_as

+1

pero ¿cómo sabe el PP el que la clave externa para vincular la tabla a? Estoy intentando esto con la base de datos de Postgres y me está dando un error 'PG :: UndefinedTable: ERROR' que está tratando de agregar una restricción de clave externa a una tabla que no existe. –

+0

¿Puede el OA comentar por qué aceptaron esta respuesta? 'belongs_to' es solo un alias para' references' que ya has probado. Si obtuviste la migración al trabajo, ¿la cambiaste de alguna forma con esta respuesta? –

+0

Lo he resuelto. Ver mi respuesta a esta pregunta –

3

No creo references acepta la opción :as, pero puede crear sus columnas manualmente ...

create_table :courses do |t| 
    t.string :name 
    t.integer :course1_id 
    t.integer :course2_id 
    t.timestamps 
end 
68

Puede hacerlo de esta manera:

create_table :courses do |t| 
    t.string :name 
    t.references :transferrable_as, references: :courses 
    t.references :same_as, references: :courses 
    t.timestamps 
end 

o el uso de t.belongs_to como un alias para t.references

No se puede agregue foreign_key: true a esas dos líneas de referencias. Si desea marcarlos como claves externas a nivel de base de datos es necesario tener una migración con esto:

add_foreign_key :courses, :courses, column: :transferrable_as_id 
add_foreign_key :courses, :courses, column: :same_as_id 
+4

La parte sobre no poder agregar 'foreign_key: true' a las líneas de referencias fue lo que me estaba molestando. Agregar el 'add_foreign_key' y especificar el nombre de la columna para aquellos hizo el truco. –

+0

¿Funciona esto de la caja en Rails? De acuerdo con http://stackoverflow.com/a/22384289/239657, esto requiere la gema 'schema_plus'. Los datos de [add_reference] (http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_reference) de Rails no mencionan a: opciones de referencias. –

+0

Funciona de fábrica con Rails 4.2 en mi experiencia. Interesante observación sobre esa opción ni estar en los documentos. Esos documentos también dicen que la opción: foreign_key está disponible pero descubrí que no. Tal vez un método diferente se llama de alguna manera. –

3

Como respuesta a esta pregunta añadido - el modelo debe tener la siguiente línea para completar la asociación:

belongs_to :transferrable_as, class_name: "Course" 
    belongs_to :same_as, class_name: "Course" 
62

Usted puede hacer todo esto en la definición inicial de migración/columna (al menos actualmente en los carriles 5):

t.references :transferable_as, index: true, foreign_key: { to_table: :courses } 
t.references :same_as, index: true, foreign_key: { to_table: :courses } 
+6

Esto funciona en Rails 5.1 y ninguna de las otras sugerencias lo hace. Es mucho más limpio, y se siente bien. – stephenmurdoch

+2

Uso Rails 5.1.4 pero no funciona. Cuando especifico una opción 'foreign_key' en la creación de la tabla de esta manera, aparece un error que dice que la misma tabla que estoy creando no existe ... Entonces sospecho que realmente no es compatible con la API oficial. – Quv

Cuestiones relacionadas