2016-03-11 2 views
1

вот дополнения, которые я сделал в моей модели:генерируя миграцию для сквозного объединения

class Event < ApplicationRecord 
    has_one :lineup 
    has_many :artists, :through => :lineup 
    belongs_to :venue 
end 

class Lineup < ApplicationRecord 
    belongs_to :artist 
    belongs_to :event 
end 

class Artist < ApplicationRecord 
    has_many :events, :through => :lineups 
end 

class Venue < ApplicationRecord 
    has_many :events 
end 

не просит о помощи с порождающим миграции для всех этих ассоциаций, но не могли бы вы по крайней мере, показать мне, как сделать это для Event?

ответ

1

Вы найдете ниже миграции для Event & Lineup (то есть ключи, позволяющие ваши модели ассоциации):

class CreateEvents < ActiveRecord::Migration 
    def change 
    create_table :events do |t| 
     t.references :venue, index: true, foreign_key: true 

     t.timestamps null: false 
    end 
    end 
end 

class CreateLineups < ActiveRecord::Migration 
    def change 
    create_table :lineups do |t| 
     t.references :artist, index: true, foreign_key: true 
     t.references :event, index: true, foreign_key: true 

     t.timestamps null: false 
    end 
    end 
end 

Для их создания, вы можете использовать:

rails g migration create_events venue:references 
rails g migration create_lineups artist:references event:references 

Если Event & Lineup уже существуют, вы можете произвести миграцию следующим образом:

rails g migration add_reference_to_events venue:references 
rails g migration add_references_to_lineups artist:references event:references 

Миграции генерироваться должно быть следующим:

class AddReferenceToEvents < ActiveRecord::Migration 
    def change 
    add_reference :events, :venue, index: true, foreign_key: true 
    end 
end 

class AddReferencesToLineups < ActiveRecord::Migration 
    def change 
    add_reference :lineups, :artist, index: true, foreign_key: true 
    add_reference :lineups, :event, index: true, foreign_key: true 
    end 
end 
+0

Я не указал это в своем посте, но все эти модели уже существуют. Не могли бы вы переписать свой ответ как дополнение к существующим моделям? Спасибо! – sivanes

+0

Добавлены миграции, если они существуют ... – sebsonic2o

0

Пожалуйста, проверьте эту миграцию на events.

class CreateEvents < ActiveRecord::Migration 
    def change 
    create_table :events do |t| 
     t.belongs_to :venue, index: true 
     t.timestamps null: false 
    end 
    end 
end 
+0

Я не указал это в своем сообщении, но все эти модели уже существуют. Не могли бы вы переписать свой ответ как дополнение к существующим моделям? Спасибо! – sivanes

1

belongs_to поместит внешний ключ в объявляющей модели, тогда как has_one будет поместить его в другой модели. В этом есть хорошие ресурсы, которые я бы рекомендовал взглянуть на них. Вот one.

Так что для модели событий я хотел бы сделать следующее:

$ rails g migration AddVenueToEvents 

Затем заполните ее:

class AddVenueToEvents < ActiveRecord::Migration 
    def change 
    add_reference :events, :venue, index: true, foreign_key: true 
    end 
end 

Я настоятельно рекомендую сделать использование что-то вроде драгоценного камня Shoulda в комбинации с RSpec, поскольку он дает чрезвычайно ценные отзывы о том, что вы должны делать. Что позволит вам писать некоторые спецификации:

RSpec.describe Events, type: :model do 

    #Associations 
    it { should belong_to(:venue) } 
    it { should have_one(:lineup) } 
    it { should have_many(:artists).through(:lineup) } 

Удивительным является то, что, как только вы запустите ваши спецификации Shoulda/RSpec даст вам очень полезную обратную связь в терминале, по существу говорит вам, где необходимый внешний ключ может отсутствовать , Сообщение может выглядеть следующим образом:

Region should have a city 
    Failure/Error: should belong_to(:city) 
     Expected Region to have a belongs_to association called city (Region does not have a city_id foreign key.) 
    # ./spec/models/region_spec.rb:5:in `block (2 levels) in <top (required)>' 

, как показано в этом other SO post что несколько связаны между собой.

+0

спасибо, я надеялся, что кто-то также прокомментирует само моделирование – sivanes

Смежные вопросы