2012-05-20 60 views
0

這裏有很多stringify_keys的問題,但我找不到適合我的問題的匹配項,所以至少在任何匹配它的例子中我都會很感激。使用多對多關聯時未定義的方法'stringify_keys'錯誤

我有三個名爲Song,Mixtape和MixtapeSong的模型。

class Song < ActiveRecord::Base 
    attr_accessible :duration, :name, :order 

    belongs_to :album 

    has_many :mixtape_songs 
    has_many :mixtapes, :through => :mixtape_songs 
end 

class Mixtape < ActiveRecord::Base 
    attr_accessible :description, :image, :name 

    has_many :mixtape_songs 
    has_many :songs, :through => :mixtape_songs 
end 

class MixtapeSong < ActiveRecord::Base 
    attr_accessible :mixtape_id, :order, :song_id 
    belongs_to :mixtape 
    belongs_to :song 
end 

,當我試圖下面通過鐵軌控制檯命令,我成功將記錄添加到mixtape_songs表mixtape_id和song_id值,但也與「訂單」 NULL:

mtape = Mixtape.find(1) 
song = Song.find(3) 
mtape.songs << song 

而且執行的update_attributes方法'Undefined method signify_keys'錯誤失敗。

params = [:mixtape_id => 1, :song_id => 3, :order => 2] 
mts = MixtapeSong.find(1) 
mts.update_attributes(params) 

我需要做的是通過添加與指定「訂單」值或通過MixtapeSong模型,而無需「未定義方法signify_keys」錯誤混音帶模型此關聯。

我想正確的方法是通過Mixtape模型添加,但我無法弄清楚如何設置'訂單'?任何幫助表示讚賞。

+1

錯誤括號!使用捲曲的:'{:mixtape_id => 1,:song_id => 3,:order => 2}' – jdoe

+0

謝謝@jdoe,我改正了它,它工作。有什麼方法可以通過Mixtape或Song模型來完成嗎?或者因爲我有一個額外的領域以外的相關領域,我必須使用MixtapeSong爲了插入/更新'訂單'VAL? – azer

+0

我說得對,您需要按照用於「插入」它們的順序爲特定的Mixtape獲取歌曲嗎? – jdoe

回答

0

擷取:

mtape = Mixtape.find(1) 
songs_in_proper_order = mtape.songs.order(mixtape_songs: :created_at) 

交換:

MixtapeSong.transaction do 
    ms1 = MixtapeSong.find(1) 
    ms2 = MixtapeSong.find(2) 

    ms1.created_at, ms2.created_at = ms2.created_at, ms1.created_at 

    ms1.save 
    ms2.save 
end 
+0

這是對的,但如果我在創建後需要重新排序歌曲,該怎麼辦? – azer

+0

這就是爲什麼我問你你的意圖!你沒有提到這種可能性:)但是,無論如何,如果你想交換2首歌曲,只需交換他們的mixtape_songs的':created_at'。你需要用':created_at'而不是':id'來定購歌曲。 – jdoe

+0

我相應地更新了我的答案。 – jdoe

相關問題