2014-02-12 31 views
1

我有一個嵌套的模型,像這樣:在預期的加入班級工作使用的has_many通過與嵌套的命名空間

class Games::Player < ActiveRecord::Base 
    attr_accessible :user_id 
    belongs_to :user 
    has_many :games_extras_achievements_players, :class_name => 'Games::Extras::AchievementsPlayer' 
    has_many :games_extras_achievements, :class_name => 'Games::Extras::Achievement',:through=>:games_extras_achievements_players 
    validates :user_id,uniqueness: true 
end 

class Games::Extras::Achievement < ActiveRecord::Base 
    has_many :games_extras_achievements_players, :class_name => 'Games::Extras::AchievementsPlayer' 
    has_many :games_players, through: :games_extras_achievements_players, class_name: 'Games::Player' 
end 

class Games::Extras::AchievementsPlayer < ActiveRecord::Base 
    attr_accessible :games_extras_achievement_id, :games_player_id 
    belongs_to :games_extras_achievement, :class_name => 'Games::Extras::Achievement' 
    belongs_to :games_player, :class_name => 'Games::Player' 
end 

對象。

但是試圖讓玩家 - >成就反之亦然給出了一個錯誤:

> p.games_extras_achievements 
    Games::Extras::Achievement Load (0.3ms) SELECT "games_extras_achievements".* FROM "games_extras_achievements" INNER JOIN "games_extras_achievements_players" ON "games_extras_achievements"."id" = "games_extras_achievements_players"."games_extras_achievement_id" WHERE "games_extras_achievements_players"."player_id" = 1 
ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column games_extras_achievements_players.player_id does not exist 
LINE 1: ...ents_players"."games_extras_achievement_id" WHERE "games_ext... 

如果我改變使用player_id像它試圖找到遷移,我得到一個錯誤,指出games_player_id does not exist

回答

0

我似乎已經修復它。

我需要使用非名稱空間列名稱並添加外鍵約束。

class Games::Player < ActiveRecord::Base 
    attr_accessible :user_id 
    belongs_to :user 
    has_many :games_extras_achievements_players, :class_name => 'Games::Extras::AchievementsPlayer' 
    has_many :games_extras_achievements, :class_name => 'Games::Extras::Achievement',:through=>:games_extras_achievements_players 
    validates :user_id,uniqueness: true 
end 

class Games::Extras::Achievement < ActiveRecord::Base 
    has_many :games_extras_achievements_players, :class_name => 'Games::Extras::AchievementsPlayer' 
    has_many :games_players, through: :games_extras_achievements_players, class_name: 'Games::Player' 
end 

class Games::Extras::AchievementsPlayer < ActiveRecord::Base 
    attr_accessible :achievement_id, :player_id 
    belongs_to :games_extras_achievement, class_name:'Games::Extras::Achievement',foreign_key: :achievement_id 
    belongs_to :games_player, class_name: 'Games::Player',foreign_key: :player_id 
end 

希望這可以節省一些人的一些惡化。

+0

此答案需要包含遷移或SQL表定義才能成爲完整的解決方案。 – rodamn