Rails:多对多Model,NoMethodError:未定义的方法

Cod*_*ang 4 ruby activerecord many-to-many ruby-on-rails

我暂时坚持这个问题.

这是我的模范关系.

class Game < ActiveRecord::Base
    has_many :participates , :dependent => :destroy
    has_many :players, through: :participates, :dependent => :destroy
end

class Player < ActiveRecord::Base
    has_many :participates , :dependent => :destroy
    has_many :games, through: :participates, :dependent => :destroy
end

class Participate < ActiveRecord::Base
  belongs_to :player
  belongs_to :game
end
Run Code Online (Sandbox Code Playgroud)

我把它放在seed.rb中

Player.destroy_all
Game.destroy_all
g1 = Game.create(game_name: "LOL")
g2 = Game.create(game_name: "DOTA")
p1 = Player.create(player_name: "Coda", games: [g1,g2]);
p2 = Player.create(player_name: "Nance", games: [g2]);
Run Code Online (Sandbox Code Playgroud)

当我使用时rails console,模型Participate工作正常.它可以找到gameplayer相对,但是后面的命令引发了错误.

[53] pry(main)> Game.first.players
  Game Load (0.4ms)  SELECT  `games`.* FROM `games`  ORDER BY `games`.`id` ASC LIMIT 1
    NoMethodError: undefined method `players' for #<Game:0x007fd0ff0ab7c0>
    from /Users/Coda/.rvm/gems/ruby-2.1.3@rails416/gems/activemodel-4.2.3/lib/active_model/attribute_methods.rb:433:in `method_missing'


[56] pry(main)> Player.first.games
      Player Load (0.4ms)  SELECT  `players`.* FROM `players`  ORDER BY `players`.`id` ASC LIMIT 1
    NoMethodError: undefined method `games' for #<Player:0x007fd0fd8a7cf0>
    from /Users/Coda/.rvm/gems/ruby-2.1.3@rails416/gems/activemodel-4.2.3/lib/active_model/attribute_methods.rb:433:in `method_missing'
Run Code Online (Sandbox Code Playgroud)

Ric*_*eck 5

首先,重新启动控制台

如果在控制台中运行时进行任何模型/代码更改,则只有在重新启动时才会再次运行.

另外,你确定你播种你的数据库 -用rake db:seed


你的代码看起来不错; 我认为这将是一个问题的两个原因如下:

  1. 你在打电话participates(也许你会更好地打电话participants)
  2. 您需要确保在关联模型中有数据

这是我要做的:

#app/models/game.rb
class Game < ActiveRecord::Base
   has_many :participants
   has_many :players, through: :participants
end

#app/models/participant.rb
class Participant < ActiveRecord::Base
   belongs_to :game
   belongs_to :player
end

#app/models/player.rb
class Player < ActiveRecord::Base
   has_many :participations, class_name: "Participant"
   has_many :games, through: :participations
end
Run Code Online (Sandbox Code Playgroud)

避免任何潜在的命名错误.


接下来,您需要确保模型中包含数据.

我已经使用many-to-many了很多次; 每当我发现你需要在关联模型中有数据才能使它工作.

$ rails c
$ g = Game.first
$ g.players
Run Code Online (Sandbox Code Playgroud)

如果这不会输出任何收集数据,则表示您的关联为空或无效.

这可能是你的问题的原因,但说实话,我不知道.为确保其有效,您可能希望Participant直接填充:

$ rails c
$ g = Game.first
$ p = Player.first
$ new_participation = Participant.create(player: p, game: g)
Run Code Online (Sandbox Code Playgroud)

如果不起作用,可能是ActiveRecord等更深层次的问题.