Ruby on Rails で、ユーザーが 2 種類の曲を聴けるアプリを作成しています。ユーザーが聴いている各曲 (およびタイプ) を追跡したいと考えています。ユーザーは、user_song または master_song を聞くことができます。私が最初に考えたのは、ポリモーフィックな関連付けを使用することでした。
まず、私のユーザーモデルは次のようになります。
class User < ActiveRecord::Base
has_many :song_listens, :foreign_key => "user_id"
その後。ポリモーフィックを次のように宣言します。
class SongListen < ActiveRecord::Base
belongs_to :listenable, :polymorphic => true
belongs_to :user
class UserSong < ActiveRecord::Base
has_many :song_listens, :as => :listenable, :class_name => "SongListen"
class MasterSong < ActiveRecord::Base
has_many :song_listens, :as => :listenable, :class_name => "SongListen"
マイ SongListens の移行:
class CreateSongListens < ActiveRecord::Migration
def change
create_table :song_listens do |t|
t.integer :user_id
t.references :listenable, :polymorphic => true
t.timestamps
end
end
end
多態性テーブルでユーザーの曲を聴いて保存しようとすると、問題が発生します。type と id に nil を取得します。--> を参照してください。
[["created_at", Mon, 07 May 2012 18:25:34 UTC +00:00], ["listenable_id", nil],["listenable_type", nil], ["updated_at", Mon, 07 May 2012 18:25:34 UTC +00:00], ["user_id", 1]]
ご覧のとおり、user_id が設定されています。
私のSongListensController:
def create
@song_listen = current_user.song_listens.build(params[:listenable_id => :user_song_id])
@song_listen.save
end
def create_ms_listen
@song_listen = current_user.song_listens.build(params[:listenable_id => :master_song_id])
@song_listen.save
end
私の見解:
<% @user_songs.each do |user_song| %>
<td><%= link_to 'Play Song', user_song.song.url, class: :play, remote: :true %></td>
<% end %>
<% @master_songs.each do |master_song| %>
<td><%= link_to 'Play Song', master_song.m_song.url, class: :play, remote: :true %></td>
<% end %>
これは私の問題の大部分を説明していると思いますが、楽しみのために、ルートを介してSongListen作成アクションにデータを送信する音楽プレーヤーを介して曲を聞くためにajaxを使用しています。
$('a.play').click(function(e) {
e.preventDefault();
$("#jquery_jplayer_1")
.jPlayer("setMedia", {mp3: this.href })
.jPlayer("play");
$.ajax({
url: '/create_ms_listen.json',
data: { "master_song_id" : "master_song.id"},
async: false
});
$.ajax({
url: '/create_us_listen.json',
data: { "user_song_id" : "user_song.id"},
async: false
});
.....
私のルートに行く:
match "create_us_listen.json" => "song_listens#create"
match "create_ms_listen.json" => "song_listens#create_ms_listen"
私の目標は、どうにかしてリッスン可能なタイプと ID を SongListen テーブルに設定することですが、これまでのところ、どちらも nil でした。私は何を間違っていますか?