2013-02-14 17 views
17

Come si crea una migrazione con due campi che fanno riferimento alla stessa tabella? Ho tabelle A e immagine. A.image1_id farà riferimento all'immagine e A.image2_id farà riferimento anche all'immagine. Ci sono solo 2 immagini, non molte. Se usoCome si aggiunge la migrazione con più riferimenti allo stesso modello in una tabella? Ruby/Rails

class AddFields < ActiveRecord::Migration 
    def change 
    change_table(:ticket) do |t| 
     t.references :image1_id 
     t.references :image2_id 
    end 
    end 
end 

non credo che funzionerà perché si aggiungerà un altro _id fino alla fine e probabilmente non saprà utilizzare il modello 'immagine'. Ho anche pensato a

change_table(:ticket) do |t| 
    t.references :image 

Ma allora come aggiungo due di quelli? Ho anche pensato di aggiungere

create_table :images do |t| 
    t.belongs_to :ticket 
    t.string :file 

Ma io voglio solo 2, non molti, e questo non sembra consentire di ottenere l'immagine dal ticket, come ticket.image1 o ticket.image2.

Secondo questa documentazione http://apidock.com/rails/v3.2.8/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table che è tutto ciò che ho potuto trovare, t.references non sembra prendere alcun argomento neanche.

change_table(:suppliers) do |t| 
    t.references :company 
end 
+0

Penso che ora creerei solo una relazione e avremo un filtro 'before_save' o' validate: my_validation' per limitare la relazione a 2 record. – Chloe

risposta

28

È possibile farlo semplicemente con il metodo add_column nelle migrazioni e impostare le associazioni corrette nelle classi:

class AddFields < ActiveRecord::Migration 
    def change 
    add_column :tickets, :image_1_id, :integer 
    add_column :tickets, :image_2_id, :integer 
    end 
end 

class Ticket < ActiveRecord::Base 
    belongs_to :image_1, :class_name => "Image" 
    belongs_to :image_2, :class_name => "Image" 
end 

class Image < ActiveRecord::Base 
    has_many :primary_tickets, :class_name => "Ticket", :foreign_key => "image_1_id" 
    has_many :secondary_tickets, :class_name => "Ticket", :foreign_key => "image_2_id" 
end 

Questo post del blog, Creating Multiple Associations with the Same Table, va più in dettaglio.

+3

Right, "t.references: x' è solo una scorciatoia per' t.column: x_id,: intero' o 't.integer: x_id'. –

+0

Quindi non ho bisogno di t.references per poter usare 'ticket.image1'? – Chloe

+0

Come ha detto @muistooshort, è un metodo di convenienza. Il tuo è un caso speciale in cui probabilmente è meglio usare un metodo di supporto diverso. – rossta

Problemi correlati