.save在Rails中的id字段中放置NULL

时间:2010-05-28 07:20:26

标签: ruby-on-rails activerecord

这是模型文件:

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之外还有许多其他功能进入数据库,但我不知道我需要指定什么以便正确设置profile_id

3 个答案:

答案 0 :(得分:2)

看看这一行:

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

我相信您要传递profile.id,而不是profile.profile_id(可能为空)。

答案 1 :(得分:0)

保存!本身不应该这样做。

也许你的问题是方法的名称。 ActiveRecord :: Base已经有一个名为create_or_update的方法(参见http://github.com/rails/rails/blob/2-3-stable/activerecord/lib/active_record/base.rb#L2913),由save调用! - 也许更换它会导致这个奇怪的问题。

尝试将方法名称更改为其他名称,这可能有所帮助。

答案 2 :(得分:0)

您首先没有将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