这是模型文件:
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
。
答案 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