use*_*579 1 ruby database-design ruby-on-rails relational-database
我正在创建一个幻想足球团队Web应用程序来学习如何在rails上使用ruby,我对关系数据库如何使用这种示例感到有些困惑.
我有一个用户,玩家,团队和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
Run Code Online (Sandbox Code Playgroud)
这些是我制作的模型.我想知道我是否需要一个新课程来将它们联系在一起?我不太确定如何链接它们 - 我在一段时间内没有做任何需要关系数据库模型的事情!
我已经成功显示了所有数据,并且我为玩家和团队制定了一些虚拟日期,但我应该如何继续进行,以便一个用户拥有一个拥有众多玩家的用户团队?
这是正确的吗?
我正在尝试将某个播放器添加到某人的个人团队中,但我觉得因为桌面设计而无法正常工作.
我正在尝试将某个播放器添加到某人的个人团队中,但我觉得因为桌面设计而无法正常工作
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
Run Code Online (Sandbox Code Playgroud)
这将允许您创建以下设置:
#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
Run Code Online (Sandbox Code Playgroud)
虽然这需要调整,但它基本上可以让你做到这一点:
#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 %>
Run Code Online (Sandbox Code Playgroud)
-
ActiveRecord协会
为了更深入地回答您的问题,您必须了解Rails使用的ActiveRecord关联的作用.ActiveRecord是用于数据驱动应用程序的"ORM"(对象关系映射器)层,允许应用程序层一起构建关联对象.
这里的区别在于,如果要在数据集中创建"关系"/"关联",则必须执行以下几项重要操作:
- 您需要了解
foreign_keys
数据表中的角色- 您需要正确关联模型
- 您需要在对象级别工作
首先,您需要了解ActiveRecord不是魔术 - 它根据foreign_key
数据表中的对象构建对象.这通常是对primary_key
父对象的引用:
这意味着每次在Rails中构建关联时,都需要使用foreign_keys
查找相应数据所需的数据表对其进行备份.
其次,您需要确保模型正确关联.提供的示例充分证明了它应该如何工作(一旦你了解它就很简单!)
第三,你需要欣赏在对象层面工作.这非常重要--Rails(因为它是基于Ruby构建的)是一个面向对象的框架,这意味着你所做的一切都是基于对象(通过Model
s,从数据库构建)
我这样说是因为我为你构建方法的方式是面向对象的 - 你想要通过添加/删除关联中的玩家来更新用户的"团队"对象.这是在Rails中实现的一个非常重要的模式 - 如果你了解它是如何工作的,它将帮助你大量增加