4

https://github.com/sferik/rails_admin/wiki/Has-many-%3Athrough-associationに関連付けられたwikiページがあるCookieカッターの問題のようです。

簡潔にしようと思います。構築しているアプリケーションにhas_many:throughの関係があります。関連するモデルは次のとおりです。

アスリート、AthleteRole、SportRole。

sports_rolesテーブルには、一塁手、二塁手など、アスリートが持つことができる一般的な役割のリストがあります。athletet_rolesテーブルは、athletet_idとsport_idを含む多対多の結合テーブルです。

私のモデルは、コード例を使用して以下に定義されています。単にAthleteを作成し、それらを1つ以上のスポーツロールに関連付けることができるようにしたいだけです(これにより、最終的に、athlete_rolesテーブルに1つ以上の新しいレコードが作成されます)。バックエンドでsaveが呼び出され、検証に合格するまで、アスリートはIDを持たないため、athletet_idを要求するべきではありません。ここで新しいsport_rolesを作成できる必要はありません。作成される新しいアスリートが引き受けることができるすべての役割は、すでに事前定義されていると想定します。

** 編集 **

明確にするために、私の質問は、スタンドアロン形式ではなく、rails_adminプラグインを使用して、アスリートの1つまたは複数の既存のスポーツロールを選択するにはどうすればよいですか?新しいスポーツの役割を作成したくはありませんが、アスリートを作成するときに既存の1つまたは2つを選択して、そのデータをathleter_rolesテーブルに反映できるようにしたいと思います。

以下のコード。

class Athlete < ActiveRecord::Base

   has_many :athlete_roles, :dependent => :delete_all, :autosave => true, :include => :sport_role
   has_many :sport_roles, :through => :athlete_roles

  attr_accessible :first_name
  attr_accessible :middle_name
  attr_accessible :last_name
  attr_accessible :suffix_name
  attr_accessible :birthdate


  # FOR RAILS_ADMIN
  # for a multiselect widget:
  attr_accessible :sport_role_ids
  accepts_nested_attributes_for :athlete_roles, :allow_destroy => true
  attr_accessible :athlete_roles_attributes
end

class AthleteRole < ActiveRecord::Base

  attr_accessible :athlete_id
  attr_accessible :sport_role_id

  # Associations
    belongs_to :athlete
    belongs_to :sport_role

    # validations
    validates :athlete_id,:presence=>true,:uniqueness=>{:scope => [:sport_role_id], :message => "is already associated with this Sport Role"}
  validates :sport_role_id,:presence=> true
end

class SportRole < ActiveRecord::Base

  has_many :athlete_roles, :dependent => :delete_all
  has_many :athletes, :through => :athlete_roles

  attr_accessible :name
  attr_accessible :short_name
  attr_accessible :description
  attr_accessible :created_at
  attr_accessible :updated_at

  attr_accessible :athlete_ids
  attr_accessible :athlete_role_ids

  validates :name, :presence => true
  validates :short_name, :presence => true
  validates :description,:length=>{:maximum => 500, :allow_nil => true}

end
4

1 に答える 1

0

ここでの問題はあなたのモデルにあると思います。

あなたが説明しているようなモデルは、has であり、多くの関係に属しており、次のようになります。

アスリート:

class Athlete < ActiveRecord::Base
  has_and_belongs_to_many :sport_roles
end

スポーツの役割

class SportRole < ActiveRecord::Base
  has_and_belongs_to_many :athletes
end

移行は次のようになります。

アスリート

class CreateAthletes < ActiveRecord::Migration
  def change
    create_table :athletes do |t|
      t.timestamps    
    end
  end
end

スポーツの役割

class CreateSportRoles < ActiveRecord::Migration
  def change
    create_table :sport_roles do |t|
      t.timestamps    
    end
  end
end

アスリートとスポーツの役割の関係

class SportRolesAthletes < ActiveRecord::Migration
  def change
    create_table :sport_roles_athletes , :id => false do |t|
      t.integer :sport_role_id
      t.integer :athlete_id
    end
  end
end
于 2013-02-28T00:28:15.563 に答える