2013-02-19 82 views
4

我有什么似乎是,即使在这里有一个相关的维基页面一个俗套的问题:https://github.com/sferik/rails_admin/wiki/Has-many-%3Athrough-associationrails_admin插件的问题与一个嵌套的has_many形式:通过关系

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

运动员,运动员角色,体育角色。

sport_roles表中列出了运动员可以拥有的一般角色,如一垒手,二垒手等。 athlete_roles表是包含athlete_id和sport_id的多对多连接表。

我的模型在下面用代码示例进行定义。我只是想创建一名运动员,并将他们与1+个运动员角色联系起来(这将最终在athlete_roles表中创建1个以上的新纪录)。它不应该问我一个athlete_id,因为运动员在后台调用save并通过验证之前不会有id。我不需要在这里创建新的sport_roles。我们将假设所有正在创建的新运动员都可以采用的角色已经预先定义好了。

**编辑**

为了澄清,我的问题是,我如何才能选择一个或多个现有体育角色使用rails_admin插件,而不是在一个独立的形式运动员?我不想创造新的体育角色,但我希望能够在创建运动员时选择现有的一两个,并将这些数据反映在athlete_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 
+0

有什么问题之间

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

关系?即:你究竟发生了什么问题,你得到的错误信息是什么? – 2013-02-19 03:07:09

+0

我编辑了我的问题,使其更加明显,我正在寻求帮助,对不起。 – randombits 2013-02-19 03:13:38

+2

什么不行?你有没有收到任何错误信息? – Automatico 2013-02-25 23:37:25

回答

0

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

像你所描述的模型,是一个has and belongs to many relation看起来应该像这样:

运动员:

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 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 
相关问题