我可以让它在 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