Rails 3模型与has_many,belongs_to和:through的关联

时间:2010-11-11 13:12:29

标签: ruby-on-rails activerecord

我正在尝试为我正在进行的一个小项目组建几个模型关联。我是Rails的新手,所以这对我来说有点混乱。

我的用例很简单。我有一个运动联盟有很多 分区。每个部门 都有许多 团队。每个团队 都有一个 队长有很多 玩家

现在,玩家和队长都由班级用户代表。区别他们的唯一因素是他们的角色。我正在使用 CanCan 来管理角色。

现在这里是我的模型以及我如何定义关联:

class Division < ActiveRecord::Base
  belongs_to :league
  has_many :teams
end

class League < ActiveRecord::Base
  has_many :divisions
end

class Team < ActiveRecord::Base
  belongs_to :division
  accepts_nested_attributes_for :division

  has_one :captain, :class_name => "User"
  accepts_nested_attributes_for :captain

  has_many :rosters
  has_many :players, :through => :rosters, :source => :user
  accepts_nested_attributes_for :players

  validates_presence_of :name
  validates_uniqueness_of :name
end

class User < ActiveRecord::Base
  has_many :authentications
  has_many :rosters
  has_many :teams, :through => :rosters
  belongs_to :team
end

And here is my generated Schema file.

  1. 我是否正确定义了模型关联?
  2. 在创建或编辑团队时,如何为团队分配玩家或队长?
  3. 非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

  1. 这个定义对我来说似乎没问题。还有其他方法(当然),但这个似乎没问题。

  2. 这取决于您的用户界面。船长应该足够简单 - 执行collection_select并将其分配给captain属性。

  3. 玩家有点棘手。通常的做法是(正如你所做的)将collection_select与html数组name(例如team[player_id][])一起使用,在你的情况下,我想你每个团队都有一定数量的玩家所以你只需要多次显示它(如果不是你可以使用javascript为用户克隆它)。