Ruby on Railsで2種類の曲を聴くことができるアプリを作成しています。私は、ユーザーが聞いている各曲(および種類)をトラッキングしたい。ユーザーはuser_songまたはmaster_songを聞くことができます。 私の最初の考えは、多形性の関連付けを使用することでした。RoR:多態性の関連付け:IDとタイプはゼロです
まず、私のユーザモデルは次のようになります。
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
私は、ユーザーの歌多型の表に耳を傾けを保存しようとすると問題がでてくる、私はこの方法を多型宣言します。私は型と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 %>
私はこれが私の問題の大部分を説明すると思うが、楽しみのために、私は歌を作成するために、AJAXを使用している音楽を通して聞きますSongListenへのルートを介してデータを送信するプレイヤーはアクションを作成します:
$('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"
私は私の目標は何とかSongListenテーブルに聴きタイプとIDを設定することです知っているが、これまでのところ、彼らは両方ともゼロとなっています。私は間違って何をしていますか?
こんにちは。 @robin私は現在、listenable_idでも0を設定しています。(私は私のビューアクションとルートを質問に追加するように編集しました) – Jches
これで 'params [:song_id]の代わりに' params [:master_song_id] ] '。しかし、あなたのjavascriptで、あなたは実際にid:' data:{"master_song_id": "master_song.id"} '。" master_song.id "を文字列にして送信するのではなく、動作しません。 – Robin
私はそれを "<%= master_song.id%>"にしようとしましたが、うまくいきませんでした。song_listenは音楽プレイヤーで再生している曲に依存していたので、jqueryの曲を再生する必要がありますあなたはこれを行う別の方法を示唆しているのでしょうか、致命的な終わりを打つのでしょうか? – Jches