2016-03-07 62 views
0

我有一个自联接在我的模型:为什么我的has_many foreign_key协会没有返回我期望的内容?

class Frame < ActiveRecord::Base 
    has_many :player_frames, class_name: 'Frame', foreign_key: 'player_id' 
    belongs_to :player 
end 

模式:

create_table "frames", force: :cascade do |t| 
    t.integer "number" 
    t.integer "player_id" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

    create_table "players", force: :cascade do |t| 
    t.integer "number" 
    t.integer "game_id" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

我会想象player_frames返回所有共享相同player_id自我同行帧。但事实并非如此。

0> player_id 
=> 1 

0> player_frames 
    Frame Load (0.4ms) SELECT "frames".* FROM "frames" WHERE "frames"."player_id" = $1 [["player_id", 4]] 
=> #<ActiveRecord::Associations::CollectionProxy []> 

为什么它试图加载player_id为4的帧?

回答

1

我想你要找的是一个的has_many:通过

class Player 
    has_many :player_frames 
    has_many :frames, through: :player_frames 
end 

class Frame 
    has_many :player_frames 
    has_many :players, through: :player_frames 
end 

class PlayerFrames 
    belongs_to :player 
    belongs_to :frame 
end 

这将允许你说player.frames和将返回所有在有玩家ID player_frames参考帧的记录。

1

随着frame_players关联表,你将能够拨打:

frame.players(返回所有用于给定帧的播放器)

player.frames(返回所有的帧为给定的播放器)

(请注意,在rails惯例中,关联表的名称应该以按字母顺序排在第一位的表名开头)

相关问题