Как мне заставить эту Ассоциацию Many_to_Many работать - PullRequest
0 голосов
/ 10 декабря 2011

У меня есть, как мне показалось, ассоциация многих ко многим, что я пытаюсь получить работу. Я могу добраться до соединительного стола с обеих сторон, но не могу пройти через соединительный стол на другую сторону. У меня есть три модели: жокей, стартер и гонки. Модели следующие:

class Jockey < ActiveRecord::Base
has_many :starters
has_many :races, :through => :starters
end

class Starter < ActiveRecord::Base
belongs_to :race
belongs_to :jockey
end

class Race < ActiveRecord::Base
has_many :starters
has_many :jockeys, :through => :starters
end

Когда я делаю это:

Jockey.find(1).starters  # everything works great

и когда я делаю это:

Race.find(1).starters # everything works great 

но если я попробую это

Race.find (1) .starters.jockeys или Jockeys.find (1) .starters.races

Я получаю ошибки:

    `Jockey Load (0.0ms)  SELECT "jockeys".* FROM "jockeys" WHERE "jockeys"."id" = 1 LIMIT 1
    NoMethodError:   Starter Load (0.0ms)  SELECT "starters".* FROM "starters" WHERE
 `"starters"."jockey_id" = 1undefined method `races' for


    #<ActiveRecord::Relation:0x4de89831>

Я пытался заставить это работать в течение нескольких часов, но не могу понять, что я делаю неправильно. Любые указания будут оценены.

Ответы [ 2 ]

1 голос
/ 10 декабря 2011

Позади Jockeys.find(1) это sql:

SELECT "jockeys".* FROM "jockeys" WHERE "jockeys"."id" = 1 LIMIT 1

т.е. теперь у вас есть конкретный жокей-объект

Но когда вы делаете Jockeys.find(1).starters.races, вы действительно вызываете метод races для экземпляра ActiveRecord :: Relation (как указывает сообщение об ошибке), а не для конкретного экземпляра Starter, как вы должны. И если подумать, starters.races действительно не имеет смысла - для какого объекта вы вызываете метод гонок?

Так что вы должны называть это так:

Jockeys.find(1).starters.first.races

.first получает конкретный объект Starter, для которого вы можете вызвать метод гонок

Но так как вы объявили, что Jockey has_many: гонки (через стартовый стол присоединения), самый простой способ получить все гонки для конкретного жокея, конечно, это:

Jockeys.find(1).races
1 голос
/ 10 декабря 2011

Обратите внимание, что startrs - это не объект Starter, это отношение / коллекция, вам нужно сначала извлечь из него объект.например,

Race.find(1).starters.first.jockey
...