我正在开发一个Rails应用程序,其中有两个模型:用户模型和团队模型。团队应该有一个captain_id,实际上是一个user_id,是通过具有一个关联实现的。现在我的问题是,在创建团队时,我无法在团队的显示页面上显示队长的姓名。
这是我的模型定义:
class Team < ApplicationRecord
has_one :captain, class_name: 'User' , foreign_key: 'captain_id'
has_many :users, dependent: :destroy
validates :ground_name, presence:true
validates :team_name, presence:true
validates :captain_id, presence:true ,uniqueness: true
end
class User < ApplicationRecord
belongs_to :team,optional: true
end
这是我的表演视图:
<table class="table table-striped">
<tr>
<th>Id</th>
<th>Team Name</th>
<th>Ground Name</th>
<th>Captain Name</th>
<th>Manage</th>
</tr>
<% @team.each do |f| %>
<tr>
<td><%= f.id %></td>
<td><%= f.team_name %></td>
<td><%= f.ground_name %></td>
<td><%= f.captain_id&.first_name %></td>
</tr>
<%end%>
</table>
这会产生错误:
2的未定义方法“ first_name”:整数
这是我的数据库架构:
ActiveRecord::Schema.define(version: 2019_02_19_090032) do
create_table "teams", force: :cascade do |t|
t.string "team_id"
t.string "team_name"
t.string "ground_name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "captain_id"
end
create_table "users", force: :cascade do |t|
t.string "first_name"
t.string "last_name"
t.string "email"
t.string "photo"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "team_id"
t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
t.index ["team_id"], name: "index_users_on_team_id"
end
end
答案 0 :(得分:2)
关联的用户应该在属性captain
下可用。因此,您的标记应如下所示:
<td><%= f.captain&.first_name %></td>
您应该定义:has_to
关系而不是:belongs_to
,以便在团队表中定义外键:
belongs_to :captain, class_name: 'User', foreign_key: :captain_id
如果您在teams表中没有定义captain_id列,则必须创建一个迁移并运行它。
要创建迁移:
跟踪迁移add_captain_id_to_teams
现在您在db / migrate中有了一个新的迁移文件,类似于db/migrate/<timestamp>_add_captain_id_to_teams.rb
打开此文件并对其进行编辑,如下所示:
class AddCaptainIdToTeams < ActiveRecord::Migration[5.0]
def change
add_column :teams, :captain_id, :integer
end
end
现在运行以下命令以创建列:
捆绑执行耙db:migrate
现在您可以分配队长ID并将其保存在数据库中。
答案 1 :(得分:2)
以下可以解决问题,
<td><%= f.captain&.first_name %></td>
但是您也可以使用以下内容
<td><%= f.captain.first_name %></td>
无需添加optional: true
,将其删除并从team.rb
中删除以下内容
validates :captain_id, presence:true ,uniqueness: true
因为我们删除了optional: true
在user.rb
中,需要更正,
belongs_to :team, optional: true, foreign_key: :captain_id