加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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吗?

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

  1. You’re calling participates (maybe you’d be better calling it participants)
  2. You need to make sure you have data in your associative models

这是我要做的:

#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等更深层次的问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读