2013-02-24 4 views
0

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

Я попытался ниже без успеха

def create 
    @team = Team.new(params[:team]) 
    @user = current_user 
    respond_to do |format| 
     if @team.save 
     format.html { redirect_to(teams_url, 
            :notice => "Team #{@team.name} was successfully created.") } 
     format.json { render :json => @team, :status => :created, :location => @team } 
     @user.update_attributes(params[:user][@team.id]) 
     else 
     format.html { render :action => "new" } 
     format.json { render :json => @team.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

команда модель

class Team < ActiveRecord::Base 
    has_many :users 
    has_many :events 
    belongs_to :division 
    belongs_to :sport 
    attr_accessible :name, :division_id, :sport_id 
    validates :name, :presence => true 

end 

модель пользователя

class User < ActiveRecord::Base 


devise :database_authenticatable, :registerable, :confirmable, 
     :recoverable, :rememberable, :trackable, :validatable, :omniauthable 

    belongs_to :sport 
    belongs_to :team 
    has_many :availabilities 

SQL выполнение

Started POST "/teams" for 127.0.0.1 at 2013-02-24 15:24:40 +1100 
Processing by TeamsController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"ztr8E+jg3hCe3cQoDefS3Rw5GQJGZfHsffffbCZiGRs=", "team"=>{"sport_id"=>"19", "division_id"=>"", "name"=>"test"}, "commit"=>"Create Team"} 
    User Load (2.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1 
    User Load (3.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 1]] 
    (0.2ms) BEGIN 
    SQL (0.9ms) INSERT INTO "teams" ("created_at", "division_id", "name", "sport_id", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id" [["created_at", Sun, 24 Feb 2013 15:24:40 EST +11:00], ["division_id", nil], ["name", "test"], ["sport_id", 19], ["updated_at", Sun, 24 Feb 2013 15:24:40 EST +11:00]] 
    (1.7ms) COMMIT 
    (0.2ms) BEGIN 
    (0.4ms) ROLLBACK 
Redirected to http://localhost:3000/teams 

ответ

0

3 варианта ниже

def create 
    @team = Team.new(params[:team]) 
    saved = false 

    Team.transaction do 
    saved = @team.save 
    if saved 
     # 1) this should work ? 
     @team.users << current_user 
     # 2) if that doesn't then this most def 
     current_user.team = @team 
     current_user.save! 
     # 3) or 
     current_user.update_attribute(:team_id, @team.id) 
    end 
    end 

    respond_to do |format| 
    if saved   
     format.html { redirect_to(teams_url, :notice => "Team #{@team.name} was successfully created.") } 
     format.json { render :json => @team, :status => :created, :location => @team }   
    else 
     format.html { render :action => "new" } 
     format.json { render :json => @team.errors, :status => :unprocessable_entity } 
    end 
    end  
end 
+0

опция все 3 опции работали, я решил использовать первый –

+0

В опции № 2 сохранение не нужно. Когда обе модели сохраняются, тогда назначение будет обновлять внешний ключ. – Cluster

+0

в # 2 - команда уже сохранена, я не верю, что будет другой вызов, сделанный в db, если он не будет явным – house9

0

Самым простым способом исправить это исправить этот аргумент ваше прохождение в update_attributes

@user.update_attributes(:team_id => @team.id) 

PARAMS хэш не имеет никакого отношения к ней в этой точке. Он содержит в основном информацию из GET/POST vars, например params [: team], которая поступает из вашей формы.

UPDATE

После просмотра ваших моделей, update_attributes не будет работать без team_id доступны, что проблема безопасности, как правило, внешние ключи не должны быть доступны. Вместо этого замените update_attributes назначением.

def create 
    @team = Team.new(params[:team]) 
    respond_to do |format| 
    if @team.save 
     format.html { redirect_to(teams_url, :notice => "Team #{@team.name} was successfully created.") } 
     format.json { render :json => @team, :status => :created, :location => @team } 
     # use assignment instead to avoid mass assignment errors 
     current_user.team = @team 
    else 
     format.html { render :action => "new" } 
     format.json { render :json => @team.errors, :status => :unprocessable_entity } 
    end 
    end 
end 
+0

, что дает мне 'неопределенный метод' stringify_keys' для 11: Fixnum' –

+0

К сожалению, писал, что слишком быстро – Cluster

+0

hrmm что build_team не кажется, чтобы передать идентификатор из модели команды для пользователей : S –

0

Эта проблема должна быть решена с использованием активных ассоциаций записей. http://guides.rubyonrails.org/association_basics.html
Это лучший способ для прохода одного элемента id к другому элементу разных данных. Поэтому попробуйте использовать активные ассоциации записей.
Обновлено

if @team.save 
    @user.update_attributes(:team_id => @team.id) 
    format.html { redirect_to(teams_url, 
            :notice => "Team #{@team.name} was successfully created.") } 
    format.json { render :json => @team, :status => :created, :location => @team } 

код Используйте обновление после сохранения не после перенаправления.

+0

они уже созданы –

+0

Могу ли я увидеть вашу конфигурацию ассоциаций? –

+0

добавлено в мои модели –

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