コードを実装する方法を理解するだけで、レールコンソールでこれを機能させることができます。
HABTM 関連付けを使用すると、ユーザーは多くのチームに参加でき、チームは多くのユーザーを持つことができます。ただし、チームは 1 人のユーザーによって所有され、ユーザーは 1 つのチームしか所有できません。
チームが作成されたときに (これは機能します)、1 対 1 の関係も関連付けることができるようにするにはどうすればよいですか?
set_user_on_team メソッドのコードに問題があります。現在、2 つのチーム レコードが生成されます。2 つ目はすべて正しい関連付けがあり、1 つ目はユーザーをチームのメンバーとして持っているだけです。
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 >
次のようにレールコンソールでこれを達成できました:
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
Team.rb
class Team < ActiveRecord::Base
attr_accessible :name
has_and_belongs_to_many :users
belongs_to :user
end