Условный has_many foreign_key в Rails? - PullRequest
0 голосов
/ 29 февраля 2012

Я работаю на веб-сайте соревнования ИИ, где вы можете загрузить контроллер pacman или ghosts, они оценены и результаты отображаются на сайте.

У меня есть одна таблица дляконтроллеры, называемые «агентами»:

class CreateAgents < ActiveRecord::Migration
  def change
    create_table :agents do |t|
      t.string :ctype # either 'pacman' or 'ghosts'
      t.references :user, :null => false
      ...
      t.timestamps
    end
    ...
  end
end

Каждый контроллер принадлежит пользователю, и они могут быть двух типов: «pacman» или «ghosts».

Выбраны два контроллера(один pacman, один ghost), и они играют в игру, и игра сохраняется в базе данных:

class CreateGames < ActiveRecord::Migration
  def change
    create_table :games do |t|
      t.integer :pacman_agent_id
      t.integer :ghosts_agent_id
      t.integer :score
      t.timestamps
    end
    ... 
  end
end

Когда я хочу выбрать, скажем, агента pacman для конкретной игры, я просто делаюa:

Game.first.pacman

с помощью использования own_to с соответствующим ключом foreign_key:

class Game < ActiveRecord::Base
  belongs_to :pacman, class_name: 'Agent', foreign_key: 'pacman_agent_id'
  belongs_to :ghosts, class_name: 'Agent', foreign_key: 'ghosts_agent_id'
end

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

Я хотел бы сделать что-то вроде этого:

Agent.first.games

Так что бы возвращались игры для этого конкретного контроллера, независимо от того, является ли он контроллером pacman или ghosts.

Это то, что я пытался, но это не работает:

class Agent < ActiveRecord::Base
  belongs_to :user
  has_many :games, foreign_key: (:ctype == 'pacman' ? 'pacman_agent_id' : 'ghosts_agent_id')
end

Есть идеи?Может быть, моя база данных неверна?

Заранее спасибо!

1 Ответ

1 голос
/ 29 февраля 2012

Есть идеи?Может быть, моя база данных неверна?

Да, это абсолютно неверно!xD

Вместо добавления двух полей идентификатора в одну модель следует использовать полиморфную ассоциацию, которая также требует два поля, но одно содержит тип (имя модели), а другое - идентификатор.Здесь вы найдете все, что вам нужно:

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

Это довольно сложно в первый раз.Theres также Railscast об этой теме (# 154).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...