Как добавить ссылки на модель, чтобы использовать ее дважды с другим именем? - PullRequest
0 голосов
/ 16 октября 2018

У меня есть две модели Game и Team.Я хочу, чтобы в каждой игре было ровно две команды: hometeam и awayteam .Я также хочу иметь доступ к @game.hometeam и @game.awayteam.

игры

 create_table "games", force: :cascade do |t|
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.datetime "start_time"
    t.datetime "end_time"
    t.string "name"
    t.integer "admin_id"
    t.integer "stadium_id"
    t.integer "hometeam_id"
    t.integer "awayteam_id"
  end

команды

create_table "teams", force: :cascade do |t|
   t.string "name"
   t.integer "capacity"
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
end

и мои контроллеры для игры, команда пуста

has_one :hometeam , :class_name => 'Team' 
has_one :awayteam , :class_name => 'Team' 

1 Ответ

0 голосов
/ 16 октября 2018

Во-первых, в соответствии с Rails API: has_one определение:

Указывает непосредственную связь с другим классом.Этот метод следует использовать только в том случае, если другой класс содержит внешний ключ.Если текущий класс содержит внешний ключ, тогда вы должны использовать вместо него own_to.См. Также обзор ActiveRecord :: Associations :: ClassMethods о том, когда использовать has_one и когда использовать own_to.

, поэтому в вашем определении Игры следует использовать : assign_to для указания этого типа отношения,

Во-вторых, чтобы указать атрибут, который будет использоваться в отношении, необходимо установить параметр :foreign_key.

По умолчанию это, как предполагается, имя ассоциации сСуффикс _id.Таким образом, класс, который определяет ассоциацию belongs_to :person, будет использовать «person_id» в качестве значения по умолчанию :foreign_key.Точно так же belongs_to :favorite_person, class_name: "Person" будет использовать внешний ключ «fav_person_id».

Таким образом, в соответствии с документами вы можете сделать:

class Game
  belongs_to :hometeam, foreing_key: 'hometeam_id', class_name: 'Team'
  belongs_to :awayteam, foreign_key: 'awayteam_id', class_name: 'Team'
end

или подразумеваемую форму:

class Game
  belongs_to :hometeam, class_name: 'Team'
  belongs_to :awayteam, class_name: 'Team'
end

Тогда каждая команда может иметь много игр:

class Team
  has_many :home_games, class_name: 'Game', foreign_key: 'hometeam_id'
  has_many :away_games, class_name: 'Game', foreign_key: 'awayteam_id'
end
...