.save помещает NULL в поле id в Rails - PullRequest
1 голос
/ 28 мая 2010

Вот файл модели:

class ProfileTag < ActiveRecord::Base     
  def self.create_or_update(options = {})
    id = options.delete(:id)
    record = find_by_id(id) || new
    record.id = id
    record.attributes = options
    puts "record.profile_id is"
    puts record.profile_id

    record.save!

    record
  end
end

Это дает мне правильную распечатку в моем журнале. Но он также говорит, что есть вызов UPDATE, который устанавливает profile_id в NULL. Вот некоторые результаты в файле журнала:

Processing ProfilesController#update (for 127.0.0.1 at 2010-05-28 18:20:54) [PUT]
Parameters: {"commit"=>"Save", "profile"=>{"id"=>"2", "password_confirmation"=>"", "username"=>"user2", "first_name"=>"user2_first", "password"=>"", "last_name"=>"user2_last"}, "authenticity_token"=>"...", "tag"=>"1", "id"=>"2"}
  ?[4;36;1mProfileTag Create (0.0ms)?[0m   ?[0;1mINSERT INTO `profile_tags` 
(`reputation_value`, `updated_at`, `tag_id`, `id`, `profile_id`, `created_at`) VALUES(0, '2010-05-29 01:20:54', 1, NULL, 4, '2010-05-29 01:20:54')?[0m
  ?[4;35;1mSQL (2.0ms)?[0m   ?[0mCOMMIT?[0m
  ?[4;36;1mSQL (0.0ms)?[0m   ?[0;1mBEGIN?[0m
  ?[4;35;1mSQL (0.0ms)?[0m   ?[0mCOMMIT?[0m
  ?[4;36;1mProfileTag Load (0.0ms)?[0m   ?[0;1mSELECT * FROM `profile_tags` WHERE (`profile_tags`.profile_id = 4) ?[0m
  ?[4;35;1mSQL (1.0ms)?[0m   ?[0mBEGIN?[0m
  ?[4;36;1mProfileTag Update (0.0ms)?[0m   ?[0;1mUPDATE `profile_tags` SET profile_id = NULL WHERE (profile_id = 4 AND id IN (35)) ?[0m

Я не уверен, что понимаю, почему INSERT правильно помещает значение в profile_id, но затем устанавливает NULL на UPDATE.

[Изменить] В ProfileController:

def update
  #...stuff. Set tags array.
  save_tags(tags) #These tags are correct. Verified by printouts before and after this call.
  respond_to do |format|
    if @profile.update_attributes(params[:profile])
      flash[:notice] = 'Profile was successfully updated.'
      #format.html { redirect_to(@profile) }
      format.html { redirect_to :action=>'show' }
      format.xml  { head :ok }
    else
      format.html { render :action => "edit" }
      format.xml  { render :xml => @profile.errors, :status => :unprocessable_entity }
    end
  end
end

def save_tags(tags)
  profile = find_profile #finds the correct profile. And I confirm that it exists with a printout
  tags.each do |t|
    ProfileTags.create_or_update(:profile_id => profile.profile_id, :tag_id => t.id)
  end
end

Если вам нужно больше подробностей, пожалуйста, дайте мне знать. Я думаю, что функциональность save делает в базе данных много, кроме INSERT s, но я не знаю, что мне нужно указать, чтобы она правильно установила profile_id.

Ответы [ 3 ]

2 голосов
/ 06 июня 2010

Посмотрите на строку:

 ProfileTags.create_or_update(:profile_id => profile.profile_id, :tag_id => t.id)

Полагаю, вы хотите передать profile.id, а не profile.profile_id (что, вероятно, равно нулю).

0 голосов
/ 02 июня 2010

Вы не передаете атрибут id методу create_or_update, поэтому вам не нужно вызывать его, просто вызовите create вместо этого, например:

def save_tags(tags)
  profile = find_profile #finds the correct profile. And I confirm that it exists with a printout
  tags.each do |t|
    ProfileTag.create(:profile_id => profile.profile_id, :tag_id => t.id)
  end
end
0 голосов
/ 28 мая 2010

сохранить! сам не должен этого делать.

Может быть, ваша проблема в названии метода. ActiveRecord :: Base уже имеет метод с именем create_or_update (см. http://github.com/rails/rails/blob/2-3-stable/activerecord/lib/active_record/base.rb#L2913), который вызывается с помощью save! - возможно, замена его вызывает эту странную проблему.

Попробуйте изменить имя вашего метода на другое, это может помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...