2013-02-15 12 views
1

В основном моя проблема заключается в том, что при попытке использовать вложенные представления в моем приложении rails мне нужно хранить как общих пользователей, так и администраторов для страницы. Оба содержат ту же информацию, что мне просто нужно знать, кто есть кто. У меня есть модель команды:Неизвестный атрибут: admin_id с вложенными представлениями и отношениями has_many

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 

И моя схема для таблицы «Команды» содержит поле admin_id. Я не понимаю, почему я получаю эту ошибку. Я пробовал довольно много поисковых запросов и поисков через форумы, и, несмотря на то, что нашел некоторые подобные проблемы, я не мог найти все те же комбинации проблем, которые у меня были.

Заранее спасибо.

EDIT Модель Пользователь:

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 %> 

Ошибка ActiveRecord :: UnknownAttributeError в TeamsController # новый

unknown attribute: user_id 

приложение/Contr ollers/teams_controller.rb: 28: в `нового»

TeamController # нового

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

Можете ли вы показать модель пользователя и вид где вы хотите добавить вложенную форму? –

+1

Стол _users_ содержит столбец «admin_id»? – shweta

+0

@shweta Таблица пользователей не содержит столбец admin_id, так как я хочу, чтобы admin_id просто был другим user_id с другим именем. – Stephen

ответ

6

Вы не можете установить: параметр foreign_key для столбца, который не существует в таблице. Ваши пользователей В таблице нет столбцов «user_id» или «admin_id».

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

см Active Record Associations

+1

Спасибо. У меня была концепция базы данных для этого отношения назад. Я не могу с этим справиться. – Stephen

0

user_id Попробуйте как foreign_key. Я думаю, что ActiveRecord не так умен, чтобы понять, что вы хотите позвонить user_id при вызове admin_id.

+0

Это была моя первая мысль. Это не сработало. – Stephen

2

Как предложил @Shweta,

вы не можете установить: foreign_key вариант столбца, который не существует в таблице. таблица ваших пользователей не имеет столбцов «user_id» или «admin_id».

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

Таким образом, если пользователь может принадлежать только одной команде, тогда вы должны использовать team_id в вашей таблице пользователей.Если у вас есть, то вы можете определить область в модели пользователя как:

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

И в вашей модели Team заменить

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

с

accepts_nested_attributes_for :users 

В вашей команде # нового действия, заменить

@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

Смежные вопросы