ruby - 如何在我的 show 方法中调用连接表?更新
问题描述
[更新,向下滚动以获取解决方案]
我正忙于使用 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 表的信息。我期望当用户将曲目添加到播放列表时,这是现有曲目将与一个/许多播放列表相关联的时候。我还没有创建将曲目添加到播放列表的功能。
现在我只是在尝试查看特定播放列表的 SHOW 页面,其中包含将呈现相关曲目的代码。我当前的代码在曲目表中找不到 playlist_id,因为它不存在。我的第一个想法是更改我的 SHOW 方法,以便它搜索 playlists_tracks 表而不是轨道表。
但是,我的语法没有意义。我应该像下面这样调用我的 playlists_tracks 表吗?有一个大写的 P 和奇异的轨道?
新的展示方式:
def show
@playlist = Playlist.find(params[:id])
@playlist_track = Playlists_track.where(playlist_id: params[:id])
end
希望我的描述的大小有所帮助,而不是矫枉过正!谢谢你的时间。
供进一步参考,这是我的相关模型
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
[更新]
- 我错过了一个 PlaylistTrack 模型
- 我的 has_many 关联需要更正
- 播放列表控制器显示方法更改了语法
新模式
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 关系的连接表非常令人困惑。我预计会出现更多错误,因为我在控制台中的测试并不乐观(播种带有曲目的播放列表),但至少播放列表显示页面现在正在呈现。
希望这会有所帮助,如果您有任何指示,请在下面留下:)
解决方案
创建作为包含代码片段的答案:我将假设“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
你能看看这有什么不同吗?
推荐阅读
- c# - 在 iText7 (.NET) 中为现有 PDF 的每一页添加页脚
- java - Android Studio - 重新格式化代码“优化导入”顺序无法正常工作
- python - 在 python Digi-XBee API 中多次打开同一个端口的问题
- javascript - 将 JSON 文件中的数据导入 JavaScript
- r - 使用 glm 预测新数据
- r - 将一个情节小提琴情节分成两组以上
- python - 我应该在哪里将 db/redis 连接绑定到 scrapy?
- javascript - 移除目标节点时移除事件监听器?
- jenkins - Groovy 逐行读取文件并将其存储到列表中
- python - 将 sagemaker 中的 pandas 数据帧写入 AWS S3 文件