ruby-on-rails – Rails:多对多Model,NoMethodError:未定义的
发布时间:2020-12-17 02:55:51 所属栏目:百科 来源:网络整理
导读:我暂时坚持这个问题. 这是我的模范关系. class Game ActiveRecord::Base has_many :participates,:dependent = :destroy has_many :players,through: :participates,:dependent = :destroyendclass Player ActiveRecord::Base has_many :participates,:depen
我暂时坚持这个问题.
这是我的模范关系. 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,:dependent => :destroy end class Participate < ActiveRecord::Base belongs_to :player belongs_to :game end 我把它放在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]); 当我使用rails控制台时,模型Participate工作正常. [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' 解决方法
首先,重新启动控制台
如果在控制台中运行时进行任何模型/代码更改,则只有在重新启动时才会再次运行. 另外,你确定你播种了你的数据库 – 使用rake db:seed吗? 你的代码看起来不错;我认为这将是一个问题的两个原因如下:
这是我要做的: #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 这应避免任何潜在的命名错误. 接下来,您需要确保模型中包含数据. 我多次使用多对多;每次我发现你需要在关联模型中有数据才能使它工作. $rails c $g = Game.first $g.players 如果这不会输出任何收集数据,则表示您的关联为空或无效. 这可能是你的问题的原因,但说实话,我不知道.为确保其有效,您可能希望直接填充参与者: $rails c $g = Game.first $p = Player.first $new_participation = Participant.create(player: p,game: g) 如果这不起作用,可能是ActiveRecord等更深层次的问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |