Ruby on rails 未定义的方法';将U键和x27字符串化;使用多对多关联时出错

Ruby on rails 未定义的方法';将U键和x27字符串化;使用多对多关联时出错,ruby-on-rails,ruby-on-rails-3,associations,Ruby On Rails,Ruby On Rails 3,Associations,这里有很多stringify_keys问题,但我找不到与我的问题相匹配的问题,所以我将感谢至少任何与之匹配的示例 我有三种型号,分别是Song、Mixstape和MixstapeSong class Song < ActiveRecord::Base attr_accessible :duration, :name, :order belongs_to :album has_many :mixtape_songs has_many :mixtapes, :through

这里有很多stringify_keys问题,但我找不到与我的问题相匹配的问题,所以我将感谢至少任何与之匹配的示例

我有三种型号,分别是Song、Mixstape和MixstapeSong

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
我需要做的是通过指定“order”值的混音带模型添加此关联,或者通过没有“Undefined method signify_keys”错误的混音带模型添加此关联

params = [:mixtape_id => 1, :song_id => 3, :order => 2]
mts = MixtapeSong.find(1)
mts.update_attributes(params)
我想正确的方法是通过混音带模型添加,但我不知道如何设置“顺序”?非常感谢您的帮助。

获取:

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

错误的括号!使用卷曲的:
{:mixstape\u id=>1,:song\u id=>3,:order=>2}
谢谢@jdoe,我纠正了它,它成功了。有没有办法通过混音带或歌曲模型来做到这一点?或者,由于我有一个额外的字段,而不是相关字段,我是否必须使用MixtapeSong来插入/更新'order'val?您是否需要按照“插入”特定混音带的顺序为特定混音带提取歌曲?没错,但如果我在创作歌曲后需要重新排序呢?这就是为什么我问你你的意图!您没有提到这种可能性:)但无论如何,如果您想交换两首歌曲,只需交换他们的混音带歌曲的
:created\u。您需要按
:created_at
而不是
:id
订购歌曲。好的,按
:created_at
订购歌曲是一种解决方案,除了关联字段外,不使用额外字段。我会试试这个,谢谢:)不是“覆盖”。它是由Rails为您创建的,应该保持这种方式。也许这就是你的意思,但值得一提。
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