0

コードを実装する方法を理解するだけで、レールコンソールでこれを機能させることができます。

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
4

1 に答える 1

0

チームに所属することとチームを所有することは 2 つの異なる関係であるため、別の名前を付けても問題ありません。

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 に答える