0

ユーザーが作成されると、チームが作成され、ユーザーはそのチームの所有者として設定され、そのチームのメンバーとしても設定されます。

ユーザーは多くのチームのメンバーになることができ、チームは多くのメンバーを持つことができます。各ユーザーは 1 つのチームのみを所有でき、チームは所有者のみを持つことができます。

今、私は理解できる奇妙な振る舞いをしています

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$KhQ7z3Qb6QXdsBA/MmPLuecrbIV4cGEaMGhIepLjuzla...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 1, current_sign_in_at: "2012-07-28 01:33:31", last_sign_in_at: "2012-07-28 01:33:31", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", created_at: "2012-07-28 01:33:31", updated_at: "2012-07-28 01:33:31"> 
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-28 01:33:31", updated_at: "2012-07-28 01:33:31", user_id: 1>] 
1.9.3p194 :003 > user.owned_team
Team Load (0.2ms)  SELECT "teams".* FROM "teams" WHERE "teams"."user_id" = 1 LIMIT 1
=> #<Team id: 1, name: "username", dept_no: nil, created_at: "2012-07-28 01:33:31", updated_at: "2012-07-28 01:33:31", user_id: 1> 

ここまではすべて期待どおりに動作しますが、相手側から関連付けフォームにアクセスしようとすると、接続が確立されません。

以下を参照してください。user.owned_team およびユーザー team.owner と同じチーム レコードを引き出しました。nil が返されます。

1.9.3p194 :004 > team = Team.first
Team Load (0.1ms)  SELECT "teams".* FROM "teams" LIMIT 1
=> #<Team id: 1, name: "username", dept_no: nil, created_at: "2012-07-28 01:33:31", updated_at: "2012-07-28 01:33:31", user_id: 1> 
1.9.3p194 :005 > team.owner
=> nil 
1.9.3p194 :006 > user.owned_team == team.owner
=> false 
1.9.3p194 :007 > 

ユーザー.rb

class User < ActiveRecord::Base

  has_and_belongs_to_many :teams
  has_one :owned_team, :class_name => "Team"

  after_create :set_user_on_team

  private

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

Team.rb

class Team < ActiveRecord::Base

  attr_accessible :name
  has_and_belongs_to_many :users
  belongs_to :owner, :class_name => "User"

end
4

1 に答える 1

1

外部キー宣言がどこかに欠けていると思います。

team テーブルに owner_id フィールドがあるとします。

class User < ActiveRecord::Base
  has_one :owned_team, :class_name => "Team", :foreign_key => 'owner_id'
end

class Team < ActiveRecord::Base
  belongs_to :owner, :class_name => "User", :foreign_key => 'owner_id'
end

このようにして、レールは両方のリンクにアクセスしたときにデータをプルする方法を知っています

于 2012-07-28T01:57:08.830 に答える