0

Ruby 2 アプリを使用した Rails 4 では、次のモデルを使用しています。

プレイリストとトラックのモデル

APlaylistは多くTrackの を持つことができ、それぞれTrackがそのposition内にその を持ちPlaylistます。新しいものごとに、スレッドセーフおよび/またはマルチプロセスセーフな方法で、最後にTrack設定したいと思います。position

私の調査では、バックグラウンド ジョブを処理する多くのプロジェクトを見つけましたが、これをバックグラウンドにしたくありません。同期させたいのです。したがって、私の API の呼び出し元は、正しいposition.

問題は、 の位置を設定するために使用される同期シリアル キューを作成する最良の方法は何TrackですかPlaylist?

4

2 に答える 2

1

他の人が示唆したように、同期呼び出しにしたい場合は、コントローラー アクションに追加するだけです。1 つだけ質問があります。トラック モデルで位置属性を明示的に要求するという要件はありますか。デフォルトでは、プレイリストに追加するトラックは最後に追加されるため

playlist = Playlist.find params[:id]
playlist.transaction.do
  playlist.tracks.create(params[:track]) 
end

したがって、最後に追加したトラックが必要な場合は、次のようにして取得できます

playlist.tracks.last

トラックに何らかの順序付けが必要な場合は、Track モデルに何らかのスコープ メソッドを追加して、トラックを「新しいものから古いものへ」または「古いものから新しいものへ」(位置属性のない例) にレンダリングできます。

scope: sort_by_newest, order('created_at desc')
scope: sort_by_oldest, order('created_at asc')

position 属性を使用した明示的なトラッキングが引き続き必要な場合は、

playlist = Playlist.find params[:id]
track_params = params[:track] || {}
track_params.merge!({position: playlist.tracks.count('id') + 1})
playlist.transaction.do
  playlist.tracks.create(track_params) 
end

トラックに何らかの順序付けが必要な場合は、Track モデルに何らかのスコープ メソッドを追加して、トラックを「新しい順」または「最も古い順」(position 属性の例) でレンダリングできます。

scope: sort_by_newest, order('position desc')
scope: sort_by_oldest, order('position asc')

それが役に立てば幸い。

于 2013-10-09T11:31:24.103 に答える
1

同期させたい場合は、キューは必要ありません。代わりに、そのプレイリストの最後のトラック位置を見つけるトランザクションで少しのコードをラップし、新しいトラックの位置をもう 1 つ設定してから、新しいトラックを保存します。このようなもの(コントローラーアクションにいると仮定):

@playlist = Playlist.find params[:id]
@track = Track.new params[:track]
@playlist.transaction do
  last_track = @playlist.tracks.order("posistion desc").first
  @track.position = last_track.position + 1
  @track.save
end
于 2013-10-09T03:52:12.657 に答える