使用has_many通过嵌套命名空间

时间:2014-02-12 21:42:31

标签: ruby-on-rails-3 rails-activerecord

我有一个像这样的嵌套模型:

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

连接类上的对象按预期工作。

然而试图获得玩家 - &gt;成就或反之亦然:

> 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

1 个答案:

答案 0 :(得分: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

希望这会使某人更加恶化。