4

我有一个似乎是千篇一律的问题,甚至在这里有一个相关的 wiki 页面:https ://github.com/sferik/rails_admin/wiki/Has-many-%3Athrough-association

我会尽量简短。我在我正在构建的应用程序中有一个 has_many :through 关系。涉及的模型如下:

运动员,AthleteRole,SportRole。

sport_roles 表有一个运动员可以拥有的通用角色列表,例如一垒手、二垒手等。运动员角色表是多对多连接表,其中包含一个运动员 ID 和一个运动 ID。

我的模型在下面用代码示例定义。我只是希望能够创建一个 Athlete 并将它们与 1+ 个运动角色相关联(这最终将在 player_roles 表中创建 1+ 个新记录)。它不应该向我询问运动员 ID,因为在后端调用 save 并且验证通过之前,运动员不会有 id。我不需要能够在这里创建新的 sport_roles。我们将假设正在创建的新运动员可以担任的所有角色都已预定义。

** 编辑 **

为了澄清,我的问题是,我如何使用 rails_admin 插件为运动员选择一个或多个现有的运动角色,而不是独立的形式?我不希望创建新的运动角色,但我希望能够在创建运动员时选择现有的一两个角色,并将该数据反映在运动员角色表中。

代码如下。

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

我认为这里的问题在于您的模型。

像您所描述的模型是一个拥有并属于许多关系的模型,应该如下所示:

运动员:

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 回答