2013-02-14 5 views
17

Wie erstelle ich eine Migration mit zwei Feldern, die auf die gleiche Tabelle verweisen? Ich habe Tabellen A und Bild. A.image1_id verweist auf das Bild, und A.image2_id verweist ebenfalls auf das Bild. Es gibt nur 2 Bilder, nicht viele. Wenn ichWie füge ich eine Migration mit mehreren Verweisen auf dasselbe Modell in einer Tabelle hinzu? Ruby/Rails

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

verwende ich glaube nicht, das wird funktionieren, weil es eine anderen _id bis zum Ende hinzufügen und wird wahrscheinlich nicht wissen, das ‚Bild‘ Modell zu verwenden. Ich dachte auch über

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

Aber dann, wie kann ich zwei von denen hinzufügen? Ich dachte auch über

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

Zugabe Aber ich will nur 2, nicht viele, und dies scheint nicht von dem Ticket für das Bild bekommen zu ermöglichen, wie ticket.image1 oder ticket.image2.

Nach dieser Dokumentation http://apidock.com/rails/v3.2.8/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table das ist alles, was ich finden konnte, scheint t.references auch keine Argumente zu nehmen.

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

Ich denke, jetzt würde ich nur eine Beziehung erstellen und einen 'before_save' Filter oder' validate: my_validation' haben, um die Beziehung auf 2 Datensätze zu begrenzen. – Chloe

Antwort

28

Sie können in Ihrem Migrationen mit dem add_column Methode, dies einfach zu tun und die richtigen Assoziationen in Ihren Klassen einzurichten:

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 

Dieser Blog-Eintrag, Creating Multiple Associations with the Same Table, geht mehr ins Detail.

+3

Rechts, 't.references: x' ist nur eine Kurzschrift für' t.column: x_id,: integer' oder 't.integer: x_id'. –

+0

Also brauche ich t.references um 'ticket.image1' benutzen zu können? – Chloe

+0

Wie @muistooshort sagte, es ist eine bequeme Methode. Ihr Fall ist ein Spezialfall, bei dem es wahrscheinlich besser ist, eine andere Hilfsmethode zu verwenden. – rossta

Verwandte Themen