如何在同一个模型中执行has_many和has_one关联?

时间:2015-04-10 13:31:46

标签: ruby-on-rails ruby-on-rails-4 associations

我需要在同一个模型中做两个关联。其中:

小组 has_many 用户 现在,我希望团队 has_one 领导

此“领导者”将是用户

我试图使用has_one throught,但我认为这种关联不起作用。

Leader.rb

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

Team.rb

class Team < ActiveRecord::Base
has_one :user, through: :leader
end

User.rb

class User < ActiveRecord::Base

belongs_to :team
has_one :captain

end

并在第27行附近得到以下错误:

NoMethodError in TeamsController#create

26 def create

**27 @team = current_user.teams.create(team_params)**

28 @team.save

29 respond_with(@team)

30 current_user.update(team_id: @team.id)

5 个答案:

答案 0 :(得分:22)

在这种情况下,我认为你需要2个模型就足够了

1)。用户模型

class User < ActiveRecord::Base
   belongs_to :team
end

2)。团队模型

 class Team < ActiveRecord::Base
   has_many :users
   belongs_to :leader, class_name: 'User', foreign_key: :leader_id
 end

答案 1 :(得分:2)

如何在名为boolean的用户表中设置leader标志。然后您的关联可以成为:

class Team < ActiveRecord::Base   
  has_many :users   
  has_one :leader, class_name: 'User', -> { where leader: true }
end

答案 2 :(得分:2)

  

团队has_many用户现在,我希望该团队has_one Leader

     

这个&#34;领导者&#34;将成为用户

使用继承(也称为子类),Leader是用户。

class User < ActiveRecord::Base
    belongs_to :team
end

class Leader < User
end

class Team < ActiveRecord::Base
    has_many :users
    has_one :leader
end

您的用户表也很重要。确保用户的create_table方法中包含t.belongs_to :teamt.string :type。请注意,Leader是用户,不需要单独的表,但是您需要允许ActiveRecord记录其类型,以便以后可以返回正确的Model。

参考文献:

inheritance特别需要&#39;单表继承&#39;

belongs_to向下滚动浏览has_one和has_many,这里使用了三种关系。

答案 3 :(得分:1)

current_user.teams.create(team_params)

小组适用于has_many关联,您需要current_user.create_team(team_params)

答案 4 :(得分:0)

has_oneuser之间存在team关联。试试这个:

current_user.create_team(team_params)

此外,您应该从teamleader添加适当的反向关联。

class Team < ActiveRecord::Base
  belongs_to :leader
  has_one :user, through: :leader
end