Techioz Blog

位置属性との順序付けされた 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 列を使用します。繰り返しますが、データベースによって異なります。