2

かなり単純明快にすべきだと思うことで、私は本当に苦労しています。うまくいけば、そこにいる誰かが私に光を当てることができます。

has_many :through 関係を持つ次のモデルがあります。

class School < ActiveRecord::Base
  attr_accessible :name

  has_many :school_mascots, :dependent => :destroy
  accepts_nested_attributes_for :school_mascots

  has_many :mascots, :through => :school_mascots
end

class Mascot < ActiveRecord::Base
  attr_accessible :name

  has_many :school_mascots, :dependent => :destroy
  has_many :schools, :through => :school_mascots
end

class SchoolMascot < ActiveRecord::Base
  # yes, it has a primary key (:id)

  attr_accessible :school_id
  belongs_to :school

  attr_accessible :mascot_id
  belongs_to :mascot
  accepts_nested_attributes_for :mascot

  attr_accessible :nickname # this is an additional attribute on the join model
end

適切なマスコットの関連付けで学校の記録を作成しようとしています. 私の学校のコントローラーは次のように見えます...

class SchoolsController < ApplicationController
  respond_to :json

  def index
    @schools = School.all
  end

  def show
    @school = School.find_by_id(params[:id])
  end

  def create
    @school = School.new(params[:school].except("mascots"))

    # add the mascot(s) to the new school; theoretically there could be more than one
    params[:school][:mascots].each do |mascot|
      # :id will be present if the mascot exists and can be reused
      # :nickname will be present if there is a nickname for the mascot
      # if :id is present, don't overwrite the mascot's data; although the nickname can be new since the join record is unique

      mascot_to_associate = {:mascot => Mascot.find_or_initialize_by_id(mascot[:id], mascot.except("nickname"))}

      if mascot[:nickname]
        mascot_to_associate.merge!(:nickname => mascot[:nickname])
      end

      @school.school_mascots.build_mascot(mascot_to_associate)
    end

    @school.save

    respond_with @school
  end
end

私のリクエストは次のjsonのように構成されています(この例には可能なすべての入力が含まれています)...

{"school":{"name":"Univerisity of Virginia","mascots":[{"id":"1"},{"id":"2","nickname":"Old Dominion"},{"name":"Hoos"},{"name":"Wah-hoo-wah","nickame":"Hoos"}]}}

したがって、マスコットは、ニックネームのない再利用されたもの (1=Wahoos)、再利用されたもの (2=Cavaliers) にもニックネームがあるもの、または真新しいものでニックネームがあるかどうかにかかわらず、4 つになる可能性があります。可能性。

学校とマスコットを関連付けることができましたが、結合テーブルにニックネームの列を導入すると、すべてが下り坂になります。関連付けを保存するためにあらゆる種類の組み合わせを試しましたが、うまくいかないようです。上記は私の最近の試みでした。しかし、あなたはそれに名前を付け、私はそれを試しました。助けが必要です。どこが間違っていますか?ありがとう!

4

0 に答える 0