如何通过关联为 has_many 下的一个参数播种多个 ID
how to seed multiple id's for one parameter under a has_many through association
一段时间以来,我一直在为这个应用程序的建模和初始种子过程而苦苦挣扎。我想在 Event
和 Artist
之间创建一个联合 table EventArtist
这样就可以检索任何活动阵容中的所有艺术家以及所有活动艺术家已参加。如何将多个 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
您需要在 EventArtist 中为每个艺术家制作单独的记录。由于您通过关联获得 has_many,因此您可以说出 event.artists
和 return 该活动中的所有艺术家。但是每个人都需要自己的 EventArtist 记录,其中有一个 artist_id
和 event_id
您还需要先创建 Event
,然后再创建任何 EventArtist
您需要将此添加到两个模型:
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
一段时间以来,我一直在为这个应用程序的建模和初始种子过程而苦苦挣扎。我想在 Event
和 Artist
之间创建一个联合 table EventArtist
这样就可以检索任何活动阵容中的所有艺术家以及所有活动艺术家已参加。如何将多个 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
您需要在 EventArtist 中为每个艺术家制作单独的记录。由于您通过关联获得 has_many,因此您可以说出 event.artists
和 return 该活动中的所有艺术家。但是每个人都需要自己的 EventArtist 记录,其中有一个 artist_id
和 event_id
您还需要先创建 Event
,然后再创建任何 EventArtist
您需要将此添加到两个模型:
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