【问题标题】:unknown attribute: admin_id with nested views and has_many relationships未知属性:具有嵌套视图和 has_many 关系的 admin_id
【发布时间】:2013-02-15 06:52:09
【问题描述】:

基本上我的问题是,当我尝试在我的 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 中的 ActiveRecord::UnknownAttributeError#new

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

【问题讨论】:

  • 你能显示用户模型和你想添加嵌套表单的视图吗?
  • users 表是否包含“admin_id”列?
  • @shweta users 表不包含 admin_id 列,因为我希望 admin_id 只是另一个名称不同的 user_id。
  • 请告诉我们错误。
  • @shweta 我应该注意,如果我使用 'user_id' 而不是 'admin_id' 会出现同样的错误

标签: ruby-on-rails ruby ruby-on-rails-3.2


【解决方案1】:

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

无论如何,Rails 都不会为您创建外键列。您需要将它们明确定义为迁移的一部分。

Active Record Associations

【讨论】:

  • 谢谢。对于这种关系,我有我的数据库概念。我可以解决这个问题。
【解决方案2】:

正如@Shweta 建议的那样,

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

无论如何,Rails 都不会为您创建外键列。您需要将它们明确定义为迁移的一部分。

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

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获取团队管理员

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-28
      • 2021-08-12
      • 2016-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多