我正在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"
My SongListens migration:
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都是零。请参阅 - &gt;:
[["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,但到目前为止它们都是零。我做错了什么?
答案 0 :(得分:3)
这是错误的:
params[:listenable_id => :user_song_id]
你能明白为什么吗?
试试:
def create
@song_listen = current_user.song_listens.build(params[:song_listen]) do |sl|
sl.listenable_id = params[:song_id]
end
@song_listen.save
end
不确定你是如何获得song_id的,但这就是主意。
$("#jpId").bind($.jPlayer.event.play, function(event) {
// This event is fired when a song start playing,
// so do your ajax request here.
// Not sure how to get the id of your song.
// You can access your media with event.jPlayer.status.media,
// and from there, get the name or id of your song I guess
});