2

基本上我的问题是,当尝试在我的 Rails 应用程序中使用嵌套视图时,我需要同时存储页面的一般用户和管理员。两者都包含相同的信息,我只需要知道谁是谁。我有一个团队模型:

class Team < ActiveRecord::Base
  attr_accessible :auth_token, :team_name, :template
  has_many :events, :dependent => :destroy
  has_many :users
  has_many :admins, :class_name => "User", :foreign_key => 'admin_id'
  accepts_nested_attributes_for :admins
end

我的 Teams 表架构包含一个 admin_id 字段。我不明白为什么会收到此错误。我已经尝试了相当多的谷歌搜索和论坛搜索,尽管发现了一些类似的问题,但我无法找到我遇到的所有相同问题组合。

提前致谢。

编辑 用户模型:

class User < ActiveRecord::Base
    require 'digest/sha1'
    attr_accessor :pre_pass
    belongs_to :team
    attr_accessible :name, :player
    attr_protected :password
    validates :name, :presence => true
    validates :pre_pass, :presence => true
    before_save :encrypt_pass
    after_save :clear_pre_pass
end

团队/新视图

<%= form_for(@team) do |f| %>
  <% if @team.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@team.errors.count, "error") %> prohibited this team from being saved:</h2>

      <ul>
      <% @team.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :team_name %><br />
    <%= f.text_field :team_name %>
  </div>
  <div class="field">
    <%= f.label :template %><br />
    <%= f.number_field :template %>
  </div>
  <div class="field">
    <%= f.label :auth_token %><br />
    <%= f.number_field :auth_token %>
</div>
    <p>
        <%= f.fields_for :admins do |builder| %>
            <%= render "admin_fields", :f => builder %>
        <% end %>
    </p>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

TeamsController#new 中的错误 ActiveRecord::UnknownAttributeError

unknown attribute: user_id

app/controllers/teams_controller.rb:28:in `new'

团队控制器#new

def new
    @team = Team.new
    @team.admins.build
    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @team }
    end
end
4

3 回答 3

7

您不能将 :foreign_key 选项设置为表中不存在的列。您的用户表没有“user_id”或“admin_id”列。

在任何情况下,Rails 都不会为您创建外键列。您需要将它们明确定义为迁移的一部分。

参见Active Record 关联

于 2013-02-15T08:26:12.020 回答
2

正如@Shweta 建议的那样,

您不能将 :foreign_key 选项设置为表中不存在的列。您的用户表没有“user_id”或“admin_id”列。

在任何情况下,Rails 都不会为您创建外键列。您需要将它们明确定义为迁移的一部分。

因此,如果用户只能属于一个团队,那么您应该team_id在用户表中使用 have。如果你有它,那么你可以在用户模型中定义一个范围:

scope :admins, where(:player => 'Admin') # I am assuming player is keeping Admin/Member.

并在您的团队模型中替换

has_many :admins, :class_name => "User", :foreign_key => 'admin_id'
accepts_nested_attributes_for :admins

accepts_nested_attributes_for :users

在您的 Teams#new 操作中,替换

@team.admins.build

@team.users.build

最后,在您看来,如果您使用 fields_for

<%= f.fields_for :users do |admin| %>
  <%= admin.hidden_field :player, :value => 'Admin' %>
  <% add other user fields %>
<% end %>

现在您可以通过以下方式获取团队管理员@team.users.admins

于 2013-02-15T09:22:21.700 回答
0

尝试user_id作为外键。我认为 ActiveRecord 不太聪明,无法理解您想在调用user_id时调用admin_id

于 2013-02-15T07:26:53.153 回答