#ruby #ruby-on-rails-5 #audio-player #playlist #audiotrack
#ruby #ruby-on-rails-5 #аудиоплеер #список воспроизведения #audiotrack
Вопрос:
[ОБНОВИТЬ, прокрутите вниз для решения]
Я занят разработкой приложения для потоковой передачи музыки с Rails и застрял на основной проблеме. Я не уверен, как вызвать мою объединенную таблицу.
Это мой поток:
- У пользователя много плейлистов> в плейлисте много дорожек> дорожка может принадлежать многим плейлистам
- Прямо сейчас пользователь может создать список воспроизведения, пользователь может просматривать индекс списков воспроизведения
- Проблема>> пользователь не может видеть треки в списке воспроизведения
У меня есть 3 таблицы, которые относятся к спискам воспроизведения и дорожкам
create_table "tracks", force: :cascade do |t|
t.string "title"
t.text "description"
t.string "artist"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.bigint "album_id", null: false
t.bigint "user_id", null: false
t.string "photo"
t.string "track"
t.index ["album_id"], name: "index_tracks_on_album_id"
t.index ["user_id"], name: "index_tracks_on_user_id"
end
create_table "playlists", force: :cascade do |t|
t.string "playlist_title"
t.text "playlist_description"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.bigint "user_id", null: false
t.index ["user_id"], name: "index_playlists_on_user_id"
end
create_table "playlists_tracks", id: false, force: :cascade do |t|
t.bigint "playlist_id", null: false
t.bigint "track_id", null: false
end
Желаемый результат -> Визуализация дорожек в Show.html.erb, где дорожки имеют playlist_id x
Мой текущий код выглядит так в моем playlists_controller.rb
def show
@playlist = Playlist.find(params[:id])
@track = Track.where(playlist_id: params[:id])
end
результатом является сообщение об ошибке
column tracks.playlist_id does not exist
LINE 1: SELECT "tracks".* FROM "tracks" WHERE "tracks"."playlist_id"...
Если я перейду к своей таблице дорожек в схеме, имеет смысл, что она не может найти значение playlist_id, потому что в таблице нет столбца playlist_id.
Однако в моей таблице соединений playlists_tracks есть playlist_id вместе с track_id.
Чего я не понимаю >>
Когда пользователь добавляет дорожку, я знаю, что информация о дорожке добавляется в таблицу дорожек. Но нет никакой информации, которая добавляется в таблицу playlists_tracks . Я ожидаю, что когда пользователь добавляет дорожку в список воспроизведения, именно тогда существующий трек будет связан с несколькими списками воспроизведения. Я еще не создал функцию, которая добавит трек в список воспроизведения.
Прямо сейчас я просто пытаюсь просмотреть страницу ПОКАЗА определенного списка воспроизведения, который содержит код, который будет отображать связанные треки. Мой текущий код не находит playlist_id в таблице tracks, потому что он не существует. Моя первая мысль — изменить мой метод SHOW, чтобы он выполнял поиск в таблице playlists_tracks вместо таблицы tracks .
However, my syntax does not make sense. do I call my playlists_tracks table like below? With a capital P and singular track?
New show method:
def show
@playlist = Playlist.find(params[:id])
@playlist_track = Playlists_track.where(playlist_id: params[:id])
end
Hope the size of my description helps and is not an overkill!
Thanks for your time.
For further reference, here are my associated models
class Playlist < ApplicationRecord
has_many :tracks, through: :playlists_tracks
has_many :tags, through: :playlists_tags
belongs_to :user
validates :playlist_title, presence: true, length: { in: 1..20 }
validates :playlist_description, presence: true, length: { in: 10..60 }
has_one_attached :photo
end
class Track < ApplicationRecord
belongs_to :album
belongs_to :user
has_many :playlists, through: :playlists_tracks
has_many :tags, through: :tags_tracks
validates :title, presence: true, length: { in: 1..20 }
validates :description, presence: true, length: { in: 10..60 }
has_one_attached :photo
has_one_attached :track
end
[UPDATE]
- I was missing a PlaylistTrack Model
- My has_many associations needed correcting
- Playlist controller show method changed syntax
new model
class PlaylistTrack < ApplicationRecord
belongs_to :track
belongs_to :playlist
end
Дополнение к схеме
create_table "playlist_tracks", force: :cascade do |t|
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.bigint "playlist_id", null: false
t.bigint "track_id", null: false
t.index ["playlist_id"], name: "index_playlist_tracks_on_playlist_id"
t.index ["track_id"], name: "index_playlist_tracks_on_track_id"
end
исправлена модель списка воспроизведения
class Playlist < ApplicationRecord
has_many :playlist_tracks
has_many :tracks, through: :playlist_tracks
has_many :tags, through: :playlist_tags
belongs_to :user
validates :playlist_title, presence: true, length: { in: 1..20 }
validates :playlist_description, presence: true, length: { in: 10..60 }
has_one_attached :photo
end
Исправлена модель трека
class Track < ApplicationRecord
belongs_to :album
belongs_to :user
has_many :playlist_tracks
has_many :playlists, through: :playlist_tracks
has_many :tags, through: :tags_tracks
validates :title, presence: true, length: { in: 1..20 }
validates :description, presence: true, length: { in: 10..60 }
has_one_attached :photo
has_one_attached :track
end
Исправленный метод показа
def show
@playlist = Playlist.find(params[:id])
@tracks = @playlist.tracks
end
Объединение таблиц с отношениями N: N настолько запутанно. Я ожидаю дальнейших ошибок, поскольку мои тесты в консоли не обещают (заполнение списка воспроизведения дорожкой), но, по крайней мере, страница показа списка воспроизведения теперь отображается.
Надеюсь, это поможет, и если у вас есть какие-либо указания, пожалуйста, оставьте их ниже 🙂
Комментарии:
1. возможно ли, что вы можете включить свои модели в пример: guides.rubyonrails.org/active_model_basics.html#model
2. Привет, Джад, теперь я обновился с моделями
Ответ №1:
Создание в качестве ответа для включения фрагментов кода: Я собираюсь предположить, что таблица «playlist_tracks» была создана с foreign keys
/ references
для соответствующих таблиц, к которым она присоединена:
class CreatePlaylistTracks < ActiveRecord::Migration[6.0]
def change
create_table :playlist_tracks do |t|
t.references :playlist, null: false, foreign_key: true
t.references :track, null: false, foreign_key: true
t.timestamps
end
end
end
вам нужно будет настроить свою модель (также предполагая, что у вас есть определенная PlaylistTrack
модель с belongs_to
s в ней):
class Playlist < ApplicationRecord
has_many :playlist_tracks, inverse_of: :playlist
has_many :tracks, through: :playlist_tracks
has_many :tags, through: :playlist_tags
belongs_to :user
validates :playlist_title, presence: true, length: { in: 1..20 }
validates :playlist_description, presence: true, length: { in: 10..60 }
has_one_attached :photo
end
затем в контроллере вы должны просто уметь делать:
def show
@playlist = Playlist.find(params[:id])
@track = @playlist.tracks
end
можете ли вы увидеть, имеет ли это значение?
Комментарии:
1. После применения ваших предложений я получил сообщение об ошибке: не удалось найти ассоциацию: playlists_tracks в списке воспроизведения модели. Кроме того, мой файл миграции выглядит немного по-другому. В настоящее время у меня нет модели PlaylistTrack, и я считаю, что мне нужно добавить ее с ее ассоциациями, чтобы иметь возможность продолжить. Будет обновляться, когда я внесу свои изменения, но все еще испытываю те же проблемы
2. так и должно быть
:playlist_tracks
… только последние слова должны быть множественными3. можете ли вы включить модель
PlaylistTrack
в свой вопрос? Я могу обновить свой ответ, если он нуждается в настройке4. Итак, ваши предложения были близки! Я создал новую модель PlaylistTrack и добавил belongs_to :track, belongs_to:playlist, которая создала новую таблицу в схеме с playlist_id и track_id. Затем мне нужно было исправить мои has_many среди моей модели трека и модели плейлиста. Обновит мой пост
5. Я предполагаю, что вам нужно будет подумать о том, чтобы сделать то же самое с
:playlist_tags
, но, надеюсь, мы вас на правильном пути
Ответ №2:
Желаемый результат -> Визуализация дорожек в Show.html.erb, где дорожки имеют playlist_id x
def show
@playlist = Playlist.find(params[:id])
@tracks = @playlist.tracks
end
Другое решение, если нужны только дорожки:
def show
@tracks = Track.includes(:playlists).where(playlists: { id: params[:id] })
end
Комментарии:
1. Спасибо, Растагот, разобрался