0

我可以让它在 Rails 控制台中工作,只是可以弄清楚如何实现代码。

使用 HABTM 关联,​​一个用户可以在多个团队中,一个团队可以有多个用户。但是一个团队由一个用户拥有,一个用户只能拥有一个团队。

如何做到这一点,以便在创建团队(有效)时,我也可以关联一对一的关系?

我在使用 set_user_on_team 方法中的代码时遇到问题。它目前产生 2 个团队记录,第二个具有所有正确的关联,第一个只是将用户作为团队成员。

1.9.3p194 :005 > Team.all
Team Load (0.2ms)  SELECT "teams".* FROM "teams" 
=> [#<Team id: 1, name: "username", dept_no: nil, created_at: "2012-07-27 12:19:00", updated_at: "2012-07-27 12:19:00", user_id: nil>, #<Team id: 2, name: "username", dept_no: nil, created_at: "2012-07-27 12:19:00", updated_at: "2012-07-27 12:19:00", user_id: 1>] 
1.9.3p194 :006 > user.teams
Team Load (0.1ms)  SELECT "teams".* FROM "teams" INNER JOIN "teams_users" ON "teams"."id" = "teams_users"."team_id" WHERE "teams_users"."user_id" = 1
=> [#<Team id: 1, name: "username", dept_no: nil, created_at: "2012-07-27 12:19:00", updated_at: "2012-07-27 12:19:00", user_id: nil>, #<Team id: 2, name: "username", dept_no: nil, created_at: "2012-07-27 12:19:00", updated_at: "2012-07-27 12:19:00", user_id: 1>] 
1.9.3p194 :007 > user.team
=> #<Team id: 2, name: "username", dept_no: nil, created_at: "2012-07-27 12:19:00", updated_at: "2012-07-27 12:19:00", user_id: 1> 

1.9.3p194:008 >

我已经能够在 Rails 控制台中实现这一点,如下所示:

1.9.3p194 :001 > user = User.first
User Load (0.1ms)  SELECT "users".* FROM "users" LIMIT 1
=> #<User id: 1, email: "test@example.com", encrypted_password: "$2a$10$MiVSB4RuFL5ubagq7YLgA.NEk9AY.uHBz.i6pfebRJgC...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 1, current_sign_in_at: "2012-07-27 11:26:11", last_sign_in_at: "2012-07-27 11:26:11", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", created_at: "2012-07-27 11:26:11", updated_at: "2012-07-27 11:26:11"> 
1.9.3p194 :002 > user.teams
Team Load (0.1ms)  SELECT "teams".* FROM "teams" INNER JOIN "teams_users" ON "teams"."id" = "teams_users"."team_id" WHERE "teams_users"."user_id" = 1
=> [#<Team id: 1, name: "username", dept_no: nil, created_at: "2012-07-27 11:26:11", updated_at: "2012-07-27 11:26:11", user_id: nil>, #<Team id: 2, name: "username", dept_no: nil, created_at: "2012-07-27 11:26:11", updated_at: "2012-07-27 11:26:11", user_id: nil>] 
1.9.3p194 :003 > user.team
Team Load (0.2ms)  SELECT "teams".* FROM "teams" WHERE "teams"."user_id" = 1 LIMIT 1
=> nil 
1.9.3p194 :004 > team = User.first.teams.first
User Load (0.2ms)  SELECT "users".* FROM "users" LIMIT 1
Team Load (0.1ms)  SELECT "teams".* FROM "teams" INNER JOIN "teams_users" ON "teams"."id" = "teams_users"."team_id" WHERE "teams_users"."user_id" = 1 LIMIT 1
=> #<Team id: 1, name: "username", dept_no: nil, created_at: "2012-07-27 11:26:11", updated_at: "2012-07-27 11:26:11", user_id: nil> 
1.9.3p194 :005 > user.team = team
(0.1ms)  SAVEPOINT active_record_1
(0.4ms)  UPDATE "teams" SET "user_id" = 1, "updated_at" = '2012-07-27 11:27:41.948931' WHERE "teams"."id" = 1
(0.0ms)  RELEASE SAVEPOINT active_record_1
=> #<Team id: 1, name: "username", dept_no: nil, created_at: "2012-07-27 11:26:11", updated_at: "2012-07-27 11:27:41", user_id: 1> 
1.9.3p194 :006 > team.user
User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
=> #<User id: 1, email: "test@example.com", encrypted_password: "$2a$10$MiVSB4RuFL5ubagq7YLgA.NEk9AY.uHBz.i6pfebRJgC...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 1, current_sign_in_at: "2012-07-27 11:26:11", last_sign_in_at: "2012-07-27 11:26:11", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", created_at: "2012-07-27 11:26:11", updated_at: "2012-07-27 11:26:11"> 
1.9.3p194 :007 > 

用户.rb

class User < ActiveRecord::Base


  has_and_belongs_to_many :teams
  has_one :team

  after_save :set_user_on_team

  private

    def set_user_on_team
      users_team = teams.create(:name => 'username' ) 
      self.team = users_team
   end
end

我尝试了以下代码,它也产生了团队记录

def set_user_on_team
      self.team = teams.create(:name => 'username' ) 
end

团队.rb

class Team < ActiveRecord::Base

  attr_accessible :name
  has_and_belongs_to_many :users
  belongs_to :user

end
4

1 回答 1

0

加入一个团队和拥有一个团队是两种不同的关系,所以给他们不同的名字,你会没事的:

class Team < ActiveRecord::Base
  has_and_belongs_to_many :users
  belongs_to :owner, :class_name => "User"
end

class User < ActiveRecord::Base
  has_and_belongs_to_many :teams
  has_one :owned_team, :class_name => "Team"
end
于 2012-07-27T11:13:45.563 回答