2015-10-20 2 views
3

Я застрял в этом вопросе какое-то время.Рельсы: от многих до многих Модель, NoMethodError: неопределенный метод

Это мое отношение .

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 

И я поставил это в 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 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/[email protected]/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/[email protected]/gems/activemodel-4.2.3/lib/active_model/attribute_methods.rb:433:in `method_missing' 

ответ

4

Во-первых, перезапустить консоль

Если вы сделаете какие-либо изменения модели/код в то время как работает в консоли, он будет работать снова только после перезагрузки.

Кроме того, Вы уверены, что засеяли свой db - с 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 

Этот должен предотвратить любые возможные ошибки именовании.


Дальше, вам нужно убедиться, что у вас есть данные в ваших моделях.

Я использовал many-to-many несколько раз; каждый раз, когда я обнаружил, что вам нужен , необходимо, чтобы данные в ассоциативной модели нуждались в нем, чтобы он работал.

$ rails c 
$ g = Game.first 
$ g.players 

Если не выходных никаких данных для сбора, это означает, что ваши ассоциации либо пустые, либо искажены.

Это может быть причиной вашей проблемы, но, честно говоря, я не знаю. Для того, чтобы убедиться, что она работает, вы может хотите заполнить Participant непосредственно:

$ rails c 
$ g = Game.first 
$ p = Player.first 
$ new_participation = Participant.create(player: p, game: g) 

Если это не работает, это может быть более серьезная проблема с ActiveRecord и т.д.

+1

перезапустить консоль, и заполнить Участвовать напрямую, и он работает. Думаю, я что-то пропустил или неправильно набрал какого-то персонажа. Спасибо, я проверю его еще раз. –

Смежные вопросы