0

ここにはたくさんの stringify_keys の質問がありますが、私の問題に適切に一致するものを見つけることができないので、少なくともそれに一致する例をいただければ幸いです。

Song、Mixtape、MixtapeSong という名前の 3 つのモデルがあります。

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

Rails コンソールから以下のコマンドを試したところ、mixtape_id と song_id の値だけでなく、'order' NULL を使用して mixtape_songs テーブルにレコードを追加することに成功しました。

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)

私がする必要があるのは、「順序」値を指定して Mixtape モデルを介して、または「Undefined method signify_keys」エラーなしで MixtapeSong モデルを介して、この関連付けを追加することです。

Mixtape モデルを介して追加するのが正しい方法だと思いますが、「順序」を設定する方法がわかりませんか? どんな助けでも大歓迎です。

4

1 に答える 1

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
于 2012-05-20T19:48:46.600 に答える