Как заполнить несколько идентификаторов для одного параметра в has_many через ассоциацию

Некоторое время я боролся с моделированием и начальным процессом посева этого приложения. Я хотел сделать совместный стол EventArtist между Event а также Artist чтобы можно было найти всех артистов, которые находятся в очереди любого события, и все события, в которых участвовали артисты. Как добавить несколько artist_idс одним событием?

вот начальный файл:

venue = Venue.create(name: "Speakeasy", address: "Lynwood Ave", zip_code: "30312")
artist = Artist.create(name: "DJ Sliink", bio: "jersey club king")
artist2 = Artist.create(name: "DJ Spinn", bio: "Teklife's chief spokesperson")
#this is probably wrong
lineup = EventArtist.create({artist_id: artist.id}, {artist_id: artist2.id})

event = Event.create(name: "Dance your ass off", 
                      date: DateTime.new(2016,2,3,10,0,0,'+7'), 
                      venue: venue, 
                      #this right here... how?
                      artist_id: , 
                      description: "free free free")

здесь соответствующие части схемы

  create_table "event_artist", id: false, force: :cascade do |t|
    t.integer "artist_id"
    t.integer "event_id"
  end

  add_index "event_artist", ["artist_id"], name: "index_event_artist_on_artist_id", using: :btree
  add_index "event_artist", ["event_id"], name: "index_event_artist_on_event_id", using: :btree

  create_table "events", force: :cascade do |t|
    t.string   "name"
    t.datetime "date"
    t.text     "description"
    t.datetime "created_at",  null: false
    t.datetime "updated_at",  null: false
    t.integer  "venue_id"
  end

  add_index "events", ["venue_id"], name: "index_events_on_venue_id", using: :btree

модели:

class Event < ApplicationRecord
  belongs_to :venue
  has many :artists, through :event_artists
end

class EventArtist < ApplicationRecord
  belongs_to :event
  belongs_to :artist
end

class Artist < ApplicationRecord
  has_many :events, through: :event_artists
end

3 ответа

Решение

Вы должны добавить это к обеим моделям:

has_many :event_artists

Модели были такими:

class Event < ApplicationRecord
  belongs_to :venue
  has_many :artists, through: :event_artists
  has_many :event_artists
end

class EventArtist < ApplicationRecord
  belongs_to :event
  belongs_to :artist
end

class Artist < ApplicationRecord
  has_many :events, through: :event_artists
  has_many :event_artists
end

Так что вы можете посеять:

event = Event.create(name: "Dance your ass off", 
                      date: DateTime.new(2016,2,3,10,0,0,'+7'), 
                      venue: venue, 
                      artists: [artist, artist2], 
                      description: "free free free")

или же

event = Event.create(name: "Dance your ass off", 
                      date: DateTime.new(2016,2,3,10,0,0,'+7'), 
                      venue: venue,  
                      description: "free free free")
event.artists << artist
event.artists << artist2

Оба будут работать. Удачи;)

Проблема здесь заключается в том, что исполнители связываются с событиями, создавая EventArtists, а не добавляя artist_id в событие.

Во-первых, нам нужно объявить, что у Event есть EventArtists. Добавьте has_many:event_artists к вашей модели событий.

В вашем начальном файле избавьтесь от artist_id при создании события.

event = Event.create(name: "Dance your ass off", 
                  date: DateTime.new(2016,2,3,10,0,0,'+7'), 
                  venue: venue, 
                  description: "free free free")

Вы можете связать художника с этим событием, создав EventArtist

EventArtist.create(event_id: event.id, artist_id: artist.id)

Поскольку rails знает связь между событиями, event_artists и исполнителями, все следующее делает одно и то же:

event.event_artists.create({artist_id: artist.id}, {artist_id: artist2.id})
event.event_artists.create({artist: artist}, {artist: artist2})
artist.event_artists.create({event_id: event.id})
artist.event_artists.create({event: event})

Теперь вы можете делать такие вещи, как

lineup = event.artists

- или же -

artist_events = artist.events

Вам нужно сделать индивидуальную запись для каждого исполнителя в EventArtist. Поскольку у вас есть has_many через ассоциацию, это позволит вам сказать event.artists и вернуть всех художников в этом случае. Но каждому нужна своя запись EventArtist с одним artist_id и event_id

Вам также необходимо создать Event перед созданием любого из EventArtists

Другие вопросы по тегам