Реляционная база данных в рубине на рельсах

Обновить

December 2018

Просмотры

2.4k раз

1

Делаю фантазии футбольной команды веб-приложение, чтобы узнать, как использовать Ruby On Rails, и я немного запутался о том, как реляционные базы данных должны работать с такого рода примеров.

У меня есть таблица для пользователей, игроков, команд и My_Team.

class Player < ActiveRecord::Base
    belongs_to :team
    has_one :team
    has_and_belongs_to_many :my_team 
end

class Team < ActiveRecord::Base
    has_many :players
end

class MyTeam < ActiveRecord::Base
    belongs_to :user
    has_many :players
end

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

Я успешно отображаюсь все данные, и у меня есть фиктивная дата в месте для игроков и команд, но как я должен вести таким образом, чтобы один пользователь имеет команду один пользователь, который имеет много игроков?

Это правильно?

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

2 ответы

3
class Player < ActiveRecord::Base
    belongs_to :team 
end

class Team < ActiveRecord::Base
    has_many :players
    belongs_to :user
end

class User< ActiveRecord::Base
    has_one :team
    has_many :players, through: :team
end

Эта структура позволяет каждому пользователю иметь команду, которая имеет много игроков

Он также позволяет получить доступ к каждому из элементов по

получить пользователи команду: @user.team

получить пользователь команд: @team.user

получить пользователь игроков: @user.players

получить пользователь игроков: @player.user

получить команды игроков: @team.players

получить игрок команды: @player.team

Надеюсь это поможет

5

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

ob264 несколько прав:

#app/models/user.rb
Class User < ActiveRecord::Base
   has_many :teams
   has_many :players, through: :teams
end

#app/models/team.rb
Class Team < ActiveRecord::Base
   #fields id | user_id | other | team | details | created_at | updated_at
   belongs_to :user

   has_many :player_teams
   has_many :players, through: :player_teams
end

#app/models/player.rb
Class Player < ActiveRecord::Base
   #fields id | team_id | other | team | details | created_at | updated_at
   has_many :player_teams
   has_many :teams, through: :player_teams
end

#app/models/player_team.rb
Class PlayerTeam < ActiveRecord::Base
    belongs_to :team
    belongs_to :player
end

Это позволит создать следующие настройки:

#config/routes.rb
resources :teams #-> domain.com/teams/5/edit

#app/controllers/players_controller.rb
Class TeamsController < ApplicationController
   def edit
       @team = Team.find params[:id]
       @team.player_teams.build
   end

   def update
       @team = Team.find params[:id]
       @team.update(team_params)
   end

   private

   def team_params
      params.require(:team).permit(:team, :params, player_teams_attributes: [:player_id, :team_id])
   end
end

Хотя это потребует тонкой настройки, он будет в основном дают вам возможность сделать это:

#app/views/teams/edit.html.erb
<%= form_for @team do |f| %>
   <%= f.fields_for :player_teams do |pt| %>
      <%= pf.collection_select :player_id, Player.all, :id, :name %> #-> adds a player to your team
   <% end %>
   <%= f.submit %>
<% end %>

-

ActiveRecord ассоциации

Чтобы ответить на ваш вопрос более глубоко, вы должны оценить роль ActiveRecord ассоциаций , которые используют Rails. ActiveRecord является «ОРМ» (Object Relational Mapper) слой для приложений , управляемых данных, позволяя прикладной уровень для создания ассоциированных объектов вместе.

Разница здесь в том, что если вы хотите создать «отношения» / «ассоциации» в наборе данных, вы должны сделать несколько важных вещей:

  1. Вы должны оценить роль foreign_keysв таблицах данных
  2. Вам нужно правильно связать свои модели
  3. Вы должны работать на объекте уровне

Во - первых, вы должны понимать , что ActiveRecord не магия - это строить объекты на основе выключения foreign_keyв таблицах данных. Это , как правило , ссылка на primary_keyродительском объект:

введите описание изображения здесь

Это означает , что каждый раз , когда вы создаете ассоциацию в Rails, вам нужно создать его резервную копию с таблицей данных , foreign_keysон должен найти соответствующие данные.

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

В- третьих, вам нужно к признательна работает на уровне объекта . Это очень важно - Rails (как он построен на Ruby) является объектно - ориентированной рамкой, а это означает , что все , что Вы делаете на основе вокруг объектов (которые построены через Modelс, из базы данных)

Я говорю это потому , что , как я построил методологию для вас выше, объект ориентирован - Вы желаете , чтобы обновить пользователя «Команда» объект путем добавления / удаления игроков из ассоциации. Это очень важная модель для реализации в Rails - это поможет вам , если вы обильно оценить , как это работает