将第二行链接到不同的数据库表,在rails中

时间:2010-12-25 00:03:40

标签: ruby-on-rails ruby ruby-on-rails-3

假设我有Users表和Team表。

在Rails中,我知道如何将Team表中的user_id列链接到Users表。但是,如果我有第二列,我也想链接到用户的表,例如user_id2(这实际上是在团队表中创建了一个订单)?

是否有解决方案,或者我不知道要做我正在尝试的事情?我也不认为“has_many”是我正在寻找的,因为user_id可能是团队经理,而user_id2可能是团队队长,即他们有不同的角色隶属于他们,并且订单很重要。

谢谢!

编辑:出于我的目的,我也不需要超过这两个用户关系。 (即三个案件不相关)

2 个答案:

答案 0 :(得分:0)

您可能需要查看STI(在该页面上查找单表继承)或Polymorphic Associations。要么你可以更清楚地表达你的意图,尽管你的问题中没有足够的信息可以解决哪个问题最合适。

给他们一个阅读,看看他们是否达到了你想要的效果。

答案 1 :(得分:0)

首先,这是一种在一个方向上执行此操作的方法(团队 - >用户),但它不适用于反向,并且我会在之后进行更好的选择。第一个假设您在manager_id表上有captain_idteams列。

class User < ActiveRecord::Base
end

class Team < ActiveRecord::Base
  belongs_to :manager, :class_name => ::User
  belongs_to :captain, :class_name => ::User
end

但是,如果一个团队只包含两个用户(经理和队长),我会感到惊讶 - 您更有可能希望联接表跟踪所有用户的团队成员资格。该连接表(在此示例中称为team_memberships)可以包含role列,其中包含经理/队长信息以及您拥有的任何其他数据。这种方式更加灵活,并提供额外的好处,例如,如果团队成员随着时间的推移而变化,他们能够跟踪历史团队数据。

class Team < ActiveRecord::Base
  has_many :team_memberships
  has_many :users, :through => :team_memberships

  def captain
    team_memberships.captain.first
  end

  def manager
    team_memberships.manager.first
  end
end

class TeamMembership < ActiveRecord::Base
  belongs_to :user
  belongs_to :team

  # You'll need some database-level UNIQUE INDEXes here to make sure
  #   you don't get multiple captains / managers per team, and also 
  #   some validations to help with error messages.
  named_scope :captain, :conditions => {:role => "captain"}
  named_scope :manager, :conditions => {:role => "manager"}
end

class User < ActiveRecord::Base
  # depending on the rules about teams, maybe these should be has_many...
  has_one :team_membership  
  has_one :team, :through => :team_memberships
end

查看http://guides.rubyonrails.org/association_basics.html了解详情。