位置属性との順序付けされた has_many_though 関連付け
概要
プレイリストとソングの 2 つのモデルがあります。プレイリストには、位置属性を持つ結合テーブル playlist_song_associations を通じて順序付けられた曲のリストがあります。
class Playlist < ApplicationRecord
has_many :playlist_song_associations, dependent: :destroy
has_many :songs, through: :playlist_song_associations
end
class Song < ApplicationRecord
has_many :playlist_song_associations, dependent: :destroy
has_many :playlists, through: :playlist_song_associations
end
class PlaylistSongAssociation < ApplicationRecord
belongs_to :playlist, touch: true
belongs_to :song
default_scope { order(position: :asc) }
end
これで、コントローラーの更新メソッドができました。次のようなことを行います。
playlist.songs = get_ordered_songs_from_params
そして、get_owned_songs_from_params 配列内の順序に従って関連付けを順序付けしたいと考えています。
Rails が関連付けの位置属性を自動的に設定するようにこれを設定する方法はありますか?
解決策
それを自動的に行うレールを入手できるかどうかの答えはおそらく「ノー」ですが、もしかしたらそれはあなたが本当に望んでいることではないでしょうか?
セットアップ方法では、PlaylistSongAssociation は実際のオブジェクトです。まるで意味があるかのように存在している。しかし、実際には、プレイリストのコンテキストの外では意味がありません。決して一人で編集しないでください。
より良いモデルは、Playlist 内に Song_id の配列を持ち、PlaylistSongAssociation を削除することです。欠点は、ほぼ確実に曲の参照整合性が失われることです。しかし、それは選択したデータベースによって異なる可能性があり、おそらくそれはあなたにとって本当の懸念ではないかもしれません(曲が削除される可能性が低いか非常にまれである場合、または問題から回復している場合)それ)。
Railsに配列列を追加する
または json 列を使用します。繰り返しますが、データベースによって異なります。