Как мне вызвать таблицу соединений в моем методе show? ОБНОВЛЕНО

#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]

  1. I was missing a PlaylistTrack Model
  2. My has_many associations needed correcting
  3. 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. Спасибо, Растагот, разобрался