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工作正常.它可以找到game并player相对,但是后面的命令引发了错误.
[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)
首先,重新启动控制台
如果在控制台中运行时进行任何模型/代码更改,则只有在重新启动时才会再次运行.
另外,你确定你播种你的数据库 -用rake db:seed?
你的代码看起来不错; 我认为这将是一个问题的两个原因如下:
- 你在打电话
participates(也许你会更好地打电话participants)- 您需要确保在关联模型中有数据
这是我要做的:
#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等更深层次的问题.
| 归档时间: |
|
| 查看次数: |
691 次 |
| 最近记录: |